-1

以下代码是抽象类的一部分,该抽象类旨在被子类化以管理特定类型的 Shape。(它实际上是特定类的存储库,但现在不相关)

protected ArrayList<? extends Shape> shapesOfSpecificType;

public addShape(Shape shape){
    getShapes; //make sure shapeOfSpecificType is instantiated and load stuff from db
    shapesOfSpecificType.add(shape); //gives an compile error
}

如何接受 Shape 子类作为 addShape 中适合添加到 ArrayList 的参数?

4

4 回答 4

0

首先,与问题无关,我建议您根据集合接口编写代码,而不是具体的类:

protected List<? extends Shape> shapesOfSpecificType;

其次,如果您希望添加扩展Shape到列表的对象,您需要将其定义为

protected List<? super Shape> shapesOfSpecificType;

所以任何东西Shape可以在列表中。

但正如其他人指出的那样:为什么需要一个有界列表,为什么不只是一个List<Shape>

干杯,

于 2013-01-03T08:20:13.393 回答
0

您可以protected List<Shape> shapesOfSpecificType;按照评论中的说明使用。您可以将任何 Shape 类型的对象添加到此列表中,例如:

Circle extends Shape {
 //body
}
Square extends Shape {
 //body
}
shapesOfSpecificType.add(new Circle());//valid
shapesOfSpecificType.add(new Square());//valid
于 2013-01-03T08:26:18.530 回答
0

当您尝试将 Shape 插入 List < ? extends Shape> 编译器抱怨,因为它不知道列表中实际有哪些元素。考虑一下:

List<Triangle> triangles = new List<Triangle>();
List<? extends Shape> shapes = triangles; // that actually works

现在,当您尝试插入将 Shape 扩展为形状的 Square 时,您会将 Square 插入到三角形列表中。这就是编译器抱怨的原因。你应该只取一个 List<Shape>:

List<Triangle> triangles = new List<Triangle>();
List<Shape> shapes = triangles; // does not work!

// but
List<Shape> shapes = new List<Shape>();
shapes.insert(new Triangle()); // works
shapes.insert(new Square()); // works as well

看看:http ://www.angelikalanger.com/Articles/JavaPro/02.JavaGenericsWildcards/Wildcards.html

此页面很好地解释了类型化集合的有效和无效。

于 2013-01-03T08:27:11.767 回答
0

我会写这样的代码:

protected ArrayList<Shape> shapesOfSpecificType;

//Triangle can be added
public void addShape(Shape shape){
    shapesOfSpecificType.add(shape);
}

//List<Triangle> can be added
public void addShapes(List<? extends Shape> shapes){
     shapesOfSpecificType.addAll(shapes);
}
于 2013-01-03T08:28:58.137 回答