List<? extends MyClass>
和List<MyClass>
之间有什么区别。这两个都不是说我有一个包含MyClass
对象的列表吗?
答案 0 :(得分:4)
有区别。 List<? extends MyClass>
可以引用List<MySubClass>
,它与List<MyClass>
不同。此外,List<MySubClass>
不是List<MyClass>
,因为Java泛型不是协变的。
因为编译器不知道通配符实际上是哪个子类,所以它阻止你调用add
来保护类型安全。
答案 1 :(得分:1)
List<? extends MyClass>
,当在方法中被接受时,会为您提供一个列表,该列表不能为类型安全添加内容,但实际上可以很好地阅读。由于我们不知道列表中MyClass
的哪个子类实际是,我们不能添加MyClass
。请注意,由于缺乏协方差,X extends Y
并不意味着Foo<X> extends Foo<Y>
。
对于List<MyClass>
,你可以很好地阅读和写作。
答案 2 :(得分:0)
GenericClass<? extends T> g
允许您为GenericClass
中的方法使用通用的 return 类型:
T item = g.get(0)
GenericClass<? super T> g
允许您为GenericClass
中的方法使用通用参数类型:
T item;
g.set(0, item)