Почему T ограничен объектом в коллекциях.Макс() подпись?
просто прошел через реализацию Java 7's java.util.Collections
класс, и увидел то, что я не понимаю. В max
сигнатура функции, почему T
ограниченном Object
?
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
max
кажется, работает нормально, если объект привязан опущен.
public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll) {
Iterator<? extends T> i = coll.iterator();
T candidate = i.next();
while (i.hasNext()) {
T next = i.next();
if (next.compareTo(candidate) > 0)
candidate = next;
}
return candidate;
}
есть ли на самом деле какие-либо ситуации, когда граница имеет значение? Если да, то просьба привести конкретный пример.
1 ответ:
эти два имеют одинаковые границы, но там и тонкое различие.
<T extends Object & Comparable<? super T>>
это приведет к
T
статьObject
под стирание.<T extends Comparable<? super T>>
это приведет к
T
статьComparable
под стирание.
в данном случае это делается потому, что
.max
предшествует Java 5. Мы можем видеть в этой ссылке Иоахим любезно предоставил, что подпись.max
в Java 1.4.2 это:public static Object max(Collection coll)
если бы мы использовали
<T extends Comparable<? super T>>
в качестве привязки, наша подпись будетpublic static Comparable max(Collection coll)
что бы сломать API. Мне удалось найти на этой странице это обсуждает преобразование старых API в общие, и это дает
.max
в качестве конкретного примера.вот они объясняют почему
max
определяется следующим образом:вы также должны убедиться, что пересмотренный API сохраняет двоичную совместимость со старыми клиентами. Этот подразумевает, что стирание API должно быть таким же, как и исходный, негенерированный API. В большинстве случаев это выпадает естественным образом, но есть и некоторые тонкие случаи. Мы рассмотрим один из самых тонких случаев, с которыми мы столкнулись, метод
Collections.max()
. Как мы видели в разделе больше удовольствия с Подстановочными знаками, правдоподобная подпись дляmax()
- это:
public static <T extends Comparable<? super T>> T max(Collection<T> coll)
это нормально, за исключением того, что стирание этой подписи:public static Comparable max(Collection coll)
который отличается от оригинальной подписи Макса():public static Object max(Collection coll)
можно было бы, конечно, указать эту подпись для max (), но это не было сделано, и все старые двоичные файлы класса, которые вызывают коллекции.max () зависит от сигнатуры, которая возвращает объект.