我试图弄清楚为什么以下似乎不适用于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的构造函数很好。所以我不明白为什么我会收到这个错误。谢谢你的帮助。
答案 0 :(得分:5)
将构造函数定义为:
public Square(List<? extends Shape> shapes)
{
// nothing
}
这意味着它接受所有扩展Shape
的类。
预防性说明:请注意由于同样的事实而产生的副作用,即它接受所有延伸Shape
的类。
答案 1 :(得分:0)
但是我在Square中使用参数List的构造函数,而Circle是一个Shape - 采用单个Shape的构造函数很好。
这是因为泛型类型在Java中是不变的。我们知道Circle
是Shape
但List<Circle>
仍然不是List<Shape>
,因此您无法将List<Circle>
替换为List<Shape>
。要填补这个空白,你必须使用@Yogendra指出的有界通配符。
您可以找到解释here。