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());