1

ジェネリックでこの例を見る:

// abstract class   
public abstract class Shape {
    public abstract void draw(Canvas c);

}

//implementation of shape class
public class Rectangle extends Shape {
    private int x, y, width, height;
    public void draw(Canvas c) { ... }
}

//function to add rectangle object in a list
public void addRectangle(List<? extends Shape> shapes) {
    shapes.add(0, new Rectangle()); // compile-time error!
}

なぜこれがコンパイルエラーになるのですか? type のリストにある shape は shape のサブクラスであり、rectangle は Shape のサブクラスであるため、わかりませんでした。

このクエリを理解するのを手伝ってください。

4

2 に答える 2

3

これは、List< ? extends Shape >渡された実際のオブジェクトがList<Rectangle>orとして宣言される可能性があることを意味するためList<Circle>です。

Rectangle を Circles のリストに挿入しようとすると、本当に問題になります。

super挿入を成功させるには、 のようにを使用する必要がありますList< ? super Shape >

これは、この関数に渡される実際のオブジェクトは、List<Shape>またはとしてのみ宣言できることを意味しますList<Object>。このようなリストには、長方形と円を一緒に含めることができます (後者の場合、リンゴとオレンジも同様です)。

于 2012-06-16T11:29:16.997 に答える
3

この正確な例は、Java チュートリアルで説明されています。

いつものように、ワイルドカードを柔軟に使用するには代償が伴います。その代償はshapes 、メソッドの本体に書き込むことが現在違法であるということです。たとえば、これは許可されていません。

public void addRectangle(List<? extends Shape> shapes) {
    // Compile-time error!
    shapes.add(0, new Rectangle());
}

上記のコードが許可されていない理由を理解できるはずです。の 2 番目のパラメータの タイプshapes.add()? extends Shape-- の未知のサブタイプですShape。型がわからないので、 Rectangle;のスーパータイプかどうかもわかりません。そのようなスーパータイプである場合とそうでない場合があるため、Rectangleそこに a を渡すのは安全ではありません。

于 2012-06-16T11:29:29.007 に答える