在java构造函数中有非抽象类列表?

时间:2012-12-04 00:13:20

标签: java oop

我试图弄清楚为什么以下似乎不适用于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的构造函数很好。所以我不明白为什么我会收到这个错误。谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

将构造函数定义为:

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

这意味着它接受所有扩展Shape的类。

预防性说明:请注意由于同样的事实而产生的副作用,即它接受所有延伸Shape的类。

答案 1 :(得分:0)

  

但是我在Square中使用参数List的构造函数,而Circle是一个Shape - 采用单个Shape的构造函数很好。

这是因为泛型类型在Java中是不变的。我们知道CircleShapeList<Circle>仍然不是List<Shape>,因此您无法将List<Circle>替换为List<Shape>。要填补这个空白,你必须使用@Yogendra指出的有界通配符。

您可以找到解释here