我想知道为什么不能用List<Number>
&gt;来呼叫List<Integer
?甚至Integer是抽象类Number的扩展类?有一个逻辑错误,因为我可以使用参数Number和Integer调用Method。
public class Que
{
public void enterNumbers(List<Number> nummern)
{
for (Number number : nummern)
{
System.out.println(number + "\n");
}
}
public void enterNum(Number num)
{
System.out.println("This is a number " + num);
}
public static void main(String[] args)
{
Que que = new Que();
Integer myInteger = new Integer(7);
// possible (of course!)
que.enterNum(myInteger);
List<Integer> num = new ArrayList<Integer>();
num.add(4);
num.add(45);
Integer inte = new Integer(333);
num.add(inte);
// not possible !
que.enterNumbers(num);
}
}
要解决这个问题,我可以使用List<?>
或List<? extends Number>
...所以我不需要解决方案,我想知道确切的原因。
我能想到的唯一解决方案是使用Number作为新的数据结构类型绑定。
答案 0 :(得分:11)
因为你可以,例如将Number
的不同子类的实例添加到List<Number>
,例如Double
类型的对象,但显然不应允许您将它们添加到List<Integer>
:
public void myMethod(List<Number> list) {
list.add(new Double(5.5));
}
如果您被允许使用myMethod
的实例拨打List<Integer>
,则在调用add
时会导致类型冲突。
答案 1 :(得分:8)
泛型不像数组那样是共变的。由于类型擦除,这是不允许的。
考虑班级Vehicle
,Bike
和Car
。
如果你做
public void addVehicle(List<Vehicle> vehicles){
vehicles.add(new Car());
}
Car
的类型为Vehicle
,您可以添加
Car
Vehicle
因为它通过了IS-A测试。List<Bike>
传递给addVehicle(List<Vehicle> vehicles)
怎么办? 您可以在自行车列表中添加Car
。这是完全错误的。因此,泛型不允许这样做。