Почему T ограничено объектом в сигнатуре Collections.max ()?

Просто прошел реализацию класса java.util.Collections в Java 7 и увидел то, чего я не понимаю. В подписи функции 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;
}

Есть ли на самом деле ситуации, когда границы имеют значение? Если да, приведите конкретный пример.

67 голосов | спросил Maxim Kirilov 21 +04002013-10-21T11:20:23+04:00312013bEurope/MoscowMon, 21 Oct 2013 11:20:23 +0400 2013, 11:20:23

1 ответ


0

Оба имеют одинаковые границы, но есть небольшая разница.

 <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), отличная от оригинальной подписи max (): public static Object max(Collection coll)

     

Можно, конечно, указать эту сигнатуру для max (), но это не было сделано, и все старые файлы двоичных классов, которые вызывают Collections.max (), зависят от сигнатуры, которая возвращает Object.

ответил Benjamin Gruenbaum 21 +04002013-10-21T11:23:30+04:00312013bEurope/MoscowMon, 21 Oct 2013 11:23:30 +0400 2013, 11:23:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132