1

以下がJavaで機能しないように見える理由を理解しようとしています。

基本的な抽象クラスは次のとおりです。

public abstract class Shape {

}

2つの具体的なクラスCircleがあるとしましょう。

public class Circle extends Shape {

}

複数のコンストラクターを持つSquare:

public class Square extends Shape {

public Square(Shape shape)
{
    // nothing
}

public Square(List<Shape> shapes)
{
    // nothing
}
}

このコードを考えると:

Circle c = new Circle();
List<Circle> cList = new ArrayList<Circle>();
Square s = new Square(c);
Square s2 = new Square(cList);

最後の行でエラーが発生します。

The constructor Square(List<Circle>) is undefined.

しかし、私はSquareにパラメーターを受け取るコンストラクターを持っておりList<Shape>、CircleはShapeです-単一のShapeを受け取るコンストラクターは問題ありません。そのため、なぜこのエラーが発生するのかわかりません。ご協力いただきありがとうございます。

4

2 に答える 2

5

コンストラクターを次のように定義します。

       public Square(List<? extends Shape> shapes)
       {
          // nothing
       }

つまり、を拡張するすべてのクラスを受け入れますShape

注意事項:同じ事実のために発生する副作用にも注意してください。つまり、を拡張するすべてのクラスを受け入れますShape

于 2012-12-04T00:16:06.737 に答える
0

しかし、SquareにはパラメーターListを受け取るコンストラクターがあり、CircleはShapeです。単一のShapeを受け取るコンストラクターは問題ありません。

これは、ジェネリック型がJavaでは不変であるという事実によるものです。Circleis-aShapeですが、まだList<Circle>is-not-aであることがわかっているため、でList<Shape>置き換えることはできません。このギャップを埋めるには、@Yogendraが指摘しているように境界付きのワイルドカードを使用する必要があります。List<Circle>List<Shape>

ここで説明を見つけることができます。

于 2012-12-04T00:23:15.943 に答える