任何人都可以给我一个以下的解释..
List<? extends Shape> typeList = new ArrayList<>();
List<Shape> shapeList = new ArrayList<>();
typeList.addAll(shapeList); //1
typeList = shapeList; //2
这里'第1行'不会编译,因为typeList被定义为采用一些扩展Shape的类。但是编译器不知道哪个类。因此编译失败。
同样的逻辑适用于'第2行'。如何将shapeList分配给typeList?为什么这一行没有给出编译错误?
答案 0 :(得分:2)
当您声明为列表类型? extends Shape
时,您可以从列表中读取Shape
个对象。但不要写信给它。因此列表或数据结构变为只读。这就是addAll
无法编译的原因。
当您使用? super Shape
时,列表变为只写。因此,如果使用? super Shape
替换代码,则代码将编译。
请参阅有关协方差和反方差的文章:
https://dzone.com/articles/covariance-and-contravariance
对于逆变,我们使用一个名为?的不同通配符?超级T,在哪里 T是我们的基本类型。有了逆转,我们可以做相反的事情。我们可以 将东西放入通用结构中,但我们无法读出任何东西 它的。