java - 如何填写List<?使用派生的 Circle 和 Rectangle 对象扩展 Shape> ?

标签 java generics wildcard

我有这些简单的类(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/

相关文章:

带有通配符和反斜杠的 MySQL LIKE 运算符

scala - 高级类型参数中下划线的使用规则

作为值的 CSS3 通配符选择器

java - 使用带有 java 配置的工厂方法创建 bean

Java 防止按钮在图标更改时调整大小

java - java代码中的嵌入式SFTP服务器

java - 泛型数组的resize方法

java - 将主体移动到特定点 [Box2D 、 Libgdx]

c# - 使用构造的返回类型覆盖通用基类属性

java - 为什么此类型不是类型参数的有效替代品?