这可能是一个非常愚蠢的问题,但是我不明白为什么编译器会抱怨和编译。
我有两个非常简单的课程:
class A {
}
class B extends A {
}
现在代码:
//block1
List list = new ArrayList<>();
list.add(new A()); //ok
list.add(new B()); //ok
//block2
List extends A> extendList= new ArrayList<>();
extendList.add(new A()); //not ok, why?
extendList.add(new B()); //not ok, why?
//block3
List super A> superList = new ArrayList<>();
superList.add(new A()); //ok
superList.add(new B()); //ok. why?
我知道它为什么起作用。
街区2,我有
extends A>
,据我所知,列表将接受类型为
A
或其子类型
一
,例如
B
. 为什么两者
add()
线路故障?错误:
Error: no suitable method found for add(A)
method java.util.Collection.add(capture#1 of ? extends A) is not applicable
(argument mismatch; A cannot be converted to capture#1 of ? extends A)
method java.util.List.add(capture#1 of ? extends A) is not applicable
(argument mismatch; A cannot be converted to capture#1 of ? extends A)
3号街区,我有
super A>
,据我所知,列表将接受类型为
一
或超类型
一
,
乙
是一个
亚型
属于
一
为什么
add(new B())
编译?
我想我可能误解了
super
和
extends
关键词,我做了一些谷歌,但我的怀疑仍然存在。
The term List is more restrictive than List extends Number>
because the former matches a list of type Number only, whereas the
latter matches a list of type Number or any of its subclasses.