Это не одно и то же.
В первом примере вы говорите: «Для некоторого типа T
, такого, что я могу привести любого T
к Comparable
супертипа T
, затем Я приму список T
и верну экземпляр T
. "
Когда вы вызываете метод с List<B>
, поскольку каждый B
является Comparable<A>
, поэтому верно сказать: «Я могу привести любой B
к Comparable
супертипа B
", а параметр типа T
разрешается в конкретный тип B
.
Во втором примере вы говорите: «Для некоторого типа T
, такого, что я могу привести любое T
к сопоставимому значению T
, тогда я приму любое список T
или любой список любого подтипа T
и вернуть экземпляр T
. "
Когда вы вызываете этот один с A List<B>
, тогда параметр типа T
разрешается в A
; конечно, любой A
является Comparable<A>
, и вы можете передать List<B>
в метод, потому что список B
действительно является списком подтипа A
.
Так вот почему оба скомпилируют.
Но вы спрашиваете о цели возможности сказать List<? extends T>
. Это позволяет вам оставаться открытым для получения коллекций (или других параметризованных типов) подклассов класса, с которым вы работаете. Обычно это то, что вам нужно, когда вы собираетесь получать объекты определенного типа и что-то с ними делать, и, как правило, вы одинаково счастливы сделать это с подтипом (поскольку подтип должен соответствовать одному и тому же контракту).
Ключевое слово super
означает, что вы можете работать с объектами, чей параметр типа является суперклассом вашего параметра типа. Типичный случай, когда вы хотите добавить объект в коллекцию. Предположим, что T
здесь разрешается в конкретный тип B
. Если вы получили List<A> myList
, тогда List.add(B)
было бы законно, потому что можно добавить B
к List<A>
. Также полезно, если ваш метод возвращает, скажем, Set<T>
- в этом случае вызывающий код не может присвоить его Set<A>
, даже если все в наборе является A
, но если вы вместо этого вернете Set<? super T>
то может. В вашем случае вы собираетесь позвонить Comparable<A>.compare(B)
и здесь, аналогично, законно передавать экземпляр B
в Comparable<A>.compare(A)
.
Для этого есть мнемоника, обсуждаемая здесь PECS "Продюсер расширяет, потребительский супер": Что такое PECS (Продюсер расширяет потребительский супер)?