Предположим, что Вы пишете статическую функцию в Java для сортировки массива, во многом как Arrays.sort()
. Проблема с Arrays.sort()
это, это получает массив Объекта и бросает a ClassCastException
если его элементы не реализуют Comparable
.
Таким образом, Вы хотите, чтобы Ваша функция получила как аргумент массив подтипа Comparable
. Что-то как этот могло работать:
static <T extends Comparable> void sort(T[] array);
Проблема с той подписью состоит в том, что можно все еще передать массив Comparables с Целыми числами и Строками, например, которые вызвали бы a RuntimeException
.
Так, как можно создать функцию, которая получит только массив, элементы которого реализуют Сопоставимый и имеют весь одинаковый тип (например, Целое число, Строка, и т.д.?)
Ответ Dirk - это лучшее, что вы можете получить, но коллекции Google использовались именно так, как вы писали, чтобы избежать ошибки в Javac:
Почему вы используете тип
В различных API, которые не «полностью извлечен»? Разве это не должно быть
,
> или
> ?
> Последнее предложение является правильным, как объяснено в эффективности Ява. Однако мы будем использовать
на Методы без параметра для того, чтобы работать вокруг отвратительной ошибки Javac. Это заставит вас проблемы, когда вы используете очень необычный тип, как
> Java.sql.timestamp
, который сопоставим с Supertype. (Нужно больше объяснения.)
От: http://code.google.com/p/google-collections/wiki/faq
Теперь это зависит от вас ...
В мире Post-1.5 Java справочные массивы - это только детали реализации низкого уровня. Предпочитаю, коллекции.
Если вы заинтересованы в справочных массивах, для какой-то особенности, вы будете осознавать, что они действительно не будут работать с дженерами. Вы не можете (разумно) иметь массив универсального типа, например , сопоставимый
. Это означает, что если массивы.sort
были выпущены аналогичным образом к коллекциям .sort
Это было бы преодолено.
Из-за особенности набора массива, если вы хотели переоценить типы, , я думаю Сортировка
может быть написано более просто чем Collections.sort
без жертвы что-нибудь значимое.
public static <T extends Comparable<T>> sort(T[] array)
Если вы хотите, чтобы двоичная совместимость с предварительными значениями, то вам понадобится небольшой взлом, чтобы вернуться к объекту []
подпись, аналогичным образом, подобным подобным коллекциям .
.
public static <T extends Object & Comparable<T>> sort(T[] array)
Использовать
static <T extends Comparable<? super T>> sort(T[] array);
, что является наиболее общей спецификацией для выполнения задачи. По сути, она утверждает, что T
- это тип, который можно сравнить с самим собой.