通用类创建

时间:2018-05-03 15:32:10

标签: java generics generic-type-argument type-variables

任何人都可以给我一个以下的解释..

List<? extends Shape> typeList = new ArrayList<>();
List<Shape> shapeList = new ArrayList<>();

typeList.addAll(shapeList); //1
typeList = shapeList; //2

这里'第1行'不会编译,因为typeList被定义为采用一些扩展Shape的类。但是编译器不知道哪个类。因此编译失败。

同样的逻辑适用于'第2行'。如何将shapeList分配给typeList?为什么这一行没有给出编译错误?

1 个答案:

答案 0 :(得分:2)

当您声明为列表类型? extends Shape时,您可以从列表中读取Shape个对象。但不要写信给它。因此列表或数据结构变为只读。这就是addAll无法编译的原因。

当您使用? super Shape时,列表变为只写。因此,如果使用? super Shape替换代码,则代码将编译。

请参阅有关协方差和反方差的文章:

https://dzone.com/articles/covariance-and-contravariance

  

对于逆变,我们使用一个名为?的不同通配符?超级T,在哪里   T是我们的基本类型。有了逆转,我们可以做相反的事情。我们可以   将东西放入通用结构中,但我们无法读出任何东西   它的。