有人可以解释一下为什么没有这一行吗? 12 给出编译时错误?
package com.soflow;
import java.util.List;
public abstract class Shape {
}
class Rectangle extends Shape {
private int x, y, width, height;
public void addRectangle(List<? extends Shape> shapes) {
shapes.add(0, new Rectangle()); // compile-time error!
}
}
我在这里无法理解的是,为什么它不允许我将形状的子类型添加到“形状”列表中?为什么它在编译时提示? 我相信编译器可以看到 Rectangle 和 Shape 之间存在 IS-A 关系。我现在很困惑。 非常感谢任何帮助。
谢谢, 马尼什·夏尔马
任何帮助将不胜感激
最佳答案
List<? extends Shape>
表示用Shape
的任何子类参数化的列表,不是接受形状的任何子类作为其内容的列表。那只是 List<Shape>
.
想象一下shapes
是 List<Triangle>
在运行时。这显然是一个错误,因为您无法将矩形添加到 List<Triangle>
.
但是,让我们考虑一下为什么 List<Rectangle>
, List<Shape>
或List<? super Shape>
这里是正确的。在第一种情况下,很明显:A List<Rectangle>
会接受 Rectangle
的实例。第二个,因为所有 Rectangle
实例可分配给Shape
,它们可以放入 List<Shape>
。在第三种情况下,绑定(bind)保证列表将接受 Shape
通过成为 Shape 的父类(super class)。
记住下面这句话:“生产者扩展,消费者 super ”。这里的列表是添加项目的消费者,因此它需要是 super
.
关于java - 为什么这段通用代码会出现编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109399/