我有这些简单的类(class):
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) { ... }
}
这些类可以在 Canvas 上绘制:
public class Canvas {
public void draw(Shape s) {
s.draw(this);
}
}
我想将所有 Circle 和 Rectangle 对象放在一个列表中,并在一个迭代语句中绘制所有它们,如下所示:
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 链路,但这是不可能的。出于某种原因,我告诉自己应该使用扩展,从那以后我再也没有质疑过这个假设。
最佳答案
尝试指定List
类型
List<Shape> list = new ArrayList<Shape>();
Shape circle = new Circle();
Rectangle rectangle = new Rectangle();
list.add(circle);
list.add(rectangle);
canvas.drawAll(list);
关于java - 如何填写List<?使用派生的 Circle 和 Rectangle 对象扩展 Shape> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43654936/