【发布时间】:2017-09-25 01:56:21
【问题描述】:
我有这些简单的类:
public abstract class Shape {
public abstract void draw(Canvas c);
}
public class Circle extends Shape {
private int x, y, radius;
public void draw(Canvas c) { ... }
}
public class Rectangle extends Shape {
private int x, y, width, height;
public void draw(Canvas c) { ... }
}
这些类可以在画布上绘制:
public class Canvas {
public void draw(Shape s) {
s.draw(this);
}
}
我想将所有 Circle 和 Rectangle 对象放在一个 List 中,并在一个迭代语句中将它们全部绘制出来,如下所示:
public void drawAll(List<? extends Shape> shapes) {
for (Shape s : shapes) {
s.draw(this);
}
}
一切都会编译。
如果我创建一个测试类并尝试创建一个这样的列表,问题就开始了:
public class Main {
public static void main(String[] args) {
Canvas canvas = new Canvas();
List<? extends Shape> list = new ArrayList<>();
Circle circle = new Circle();
Rectangle rectangle = new Rectangle();
list.add(circle); // The method add(capture#1-of ? extends Shape) in the type List<capture#1-of ? extends Shape> is not applicable for the arguments (Circle)
canvas.drawAll(list);
}
}
如代码中所述,我无法将 Circle 和 Rectangle 对象添加到列表中。
问题:我应该如何修改代码,以便我可以构造一个
List<? extends Shape>
然后遍历该列表以绘制形状。
提前致谢。
发布编辑:谢谢!那是一个相当大的突破。应该把功劳归功于 SpaceTrucker 和他关键的 PECS 链接,但那是不可能的。出于某种原因,我告诉自己我应该使用扩展,从那以后就再也没有质疑过这个假设。
【问题讨论】:
-
和官方教程里的这个基本一样:docs.oracle.com/javase/tutorial/java/generics/…