2013-09-19 2 views

ответ

4

Есть разница. A List<? extends MyClass> может относиться к List<MySubClass>, который отличается от List<MyClass>. Кроме того, List<MySubClass> не является List<MyClass>, поскольку Java-дженерики не являются ковариантными.

Поскольку компилятор не знает , который подклассом на самом деле является, он не позволяет вам звонить add, чтобы сохранить безопасность типа.

1

List<? extends MyClass>, принятый в методе, дает вам список, который не может иметь вещей, добавленных для безопасности типа, но на самом деле может быть прочитан довольно хорошо. Поскольку мы не знаем, какой из подклассов MyClass список на самом деле, мы добавим MyClass. Обратите внимание, что X extends Y не означает Foo<X> extends Foo<Y> из-за отсутствия ковариации.

Для List<MyClass> вы можете хорошо читать и писать.

+0

@Thilo Мне пришлось бы делать эксперименты для нулевого случая, когда у меня есть время. – hexafraction

+1

«О, это снова?» Возможно, вы могли бы помочь искать/голосовать, чтобы закрыть как дубликат. –

0

GenericClass<? extends T> g позволяет использовать общий возвращение типа для метода в GenericClass:

T item = g.get(0) 

GenericClass<? super T> g позволяет использовать общий аргумент типа для метода в GenericClass:

T item; 
g.set(0, item) 
+0

GenericClass? 'get' и' set' определены в 'List'. Как они будут работать для «GenericClass», полностью подходит для захватов. – Thilo

Смежные вопросы