Почему 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 67

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 () зависит от сигнатуры, которая возвращает объект.