为什么即使Integer扩展Number,也无法使用List 调用List ?

我想知道为什么不能用List<Integer >调用List >甚至Integer是抽象类Number的扩展类? 有一个逻辑错误,因为我可以使用参数Number和Integer调用Method。

 public class Que { public void enterNumbers(List 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 num = new ArrayList(); num.add(4); num.add(45); Integer inte = new Integer(333); num.add(inte); // not possible ! que.enterNumbers(num); } } 

为了解决这个问题,我可以使用ListList List …所以我不需要解决方案我想知道确切的原因。

我能想到的唯一解决方案是使用Number作为新的数据结构类型绑定。

因为您可以例如将Number的不同子类的实例添加到List ,例如Double类型的对象,但显然不应该允许将它们添加到List

 public void myMethod(List list) { list.add(new Double(5.5)); } 

如果允许使用List的实例调用myMethod ,则在调用add时会导致类型冲突。

generics不像数组那样是共变的。 由于类型擦除,这是不允许的。

考虑VehicleBikeCar

如果你做

 public void addVehicle(List vehicles){ vehicles.add(new Car()); } 
  • 这是可能的,因为CarVehicle类型,您可以将Car添加到Vehicle因为它通过了IS-A测试。
  • 但是如果允许将List传递给addVehicle(List vehicles)呢?

你会添加一辆Car到自行车列表。 这是完全错误的。 因此generics不允许这样做。

阅读有关generics的多态性