java泛型<;?扩展A>;v、 s<;A>;vs<;?超级A>;

java泛型<;?扩展A>;v、 s<;A>;vs<;?超级A>;,java,generics,Java,Generics,这可能是一个非常愚蠢的问题,但是我不明白编译器为什么抱怨和编译 我有两个非常简单的类: class A { } class B extends A { } 现在代码是: //block1 List<A> list = new ArrayList<>(); list.add(new A()); //ok list.add(new B()); //ok //block2 List<? extends A> extendList= new ArrayList

这可能是一个非常愚蠢的问题,但是我不明白编译器为什么抱怨和编译

我有两个非常简单的类:

class A {
}

class B extends A {
}
现在代码是:

//block1
List<A> 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?
block3,我有
block2:“据我所知,列表将接受类型为A或子类型为A的对象,例如B”-否!考虑一下
的可能值,例如,它可能是一个
类C扩展了一个{}
,这意味着
a
B
都不符合约束条件。不能将
A
B
添加到泛型类型为
C
的列表中

块3:再次考虑
的可能值:现在它可以是
A
或其任何超类,因此
A
对象(或介于两者之间的任何对象)。由于
B
a
的一个子类型,它当然也是
a
的所有超类的一个子类型。每个接受
A
列表
也将接受
B

block2:“据我所知,列表将接受类型为A或子类型为A的对象,例如B”-否!考虑一下
的可能值,例如,它可能是一个
类C扩展了一个{}
,这意味着
a
B
都不符合约束条件。不能将
A
B
添加到泛型类型为
C
的列表中


块3:再次考虑
的可能值:现在它可以是
A
或其任何超类,因此
A
对象(或介于两者之间的任何对象)。由于
B
a
的一个子类型,它当然也是
a
的所有超类的一个子类型。每个接受
A
列表
也会接受
B

这里有一个场景来说明这一点。考虑一个第三类:

class C extends A {
}

List<C> cList = new ArrayList<>();
List<? extends A> extendList = cList; //this is valid. Right? Yes
但是我们会在列表中添加一个不兼容的(
B
)类型(
C


原因是边界:
这里有一个场景来说明。考虑一个第三类:

class C extends A {
}

List<C> cList = new ArrayList<>();
List<? extends A> extendList = cList; //this is valid. Right? Yes
但是我们会在列表中添加一个不兼容的(
B
)类型(
C


原因是边界:
列表
列表我有一个猜测,但你能尝试做
列表吗我有一个猜测,但你能尝试做
列表吗
class C extends A {
}

List<C> cList = new ArrayList<>();
List<? extends A> extendList = cList; //this is valid. Right? Yes
extendList.add(new B());