1

我试图弄清楚为什么以下内容在 Java 中似乎不起作用。

这是基本的抽象类:

public abstract class Shape {

}

假设它有两个具体的类,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>,因此您不能用List<Circle>替换List<Shape>。要填补这一空白,您必须使用@Yogendra 指出的有界通配符。

你可以在这里找到解释。

于 2012-12-04T00:23:15.943 回答