-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
}

ArrayListに追加するのに適したaddShapeの引数としてShapeサブクラスを受け入れるにはどうすればよいですか?

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

シェイプをリストに挿入しようとすると < ? extends Shape> 実際にリストにある要素の種類を知ることができないため、コンパイラは文句を言います。このことを考慮:

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

Shape をシェイプに拡張する Square を挿入しようとすると、Square を Triangles のリストに挿入します。それがコンパイラが文句を言う理由です。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 に答える