为什么即使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); } }
为了解决这个问题,我可以使用List
或List
List
…所以我不需要解决方案我想知道确切的原因。
我能想到的唯一解决方案是使用Number作为新的数据结构类型绑定。
因为您可以例如将Number
的不同子类的实例添加到List
,例如Double
类型的对象,但显然不应该允许将它们添加到List
:
public void myMethod(List list) { list.add(new Double(5.5)); }
如果允许使用List
的实例调用myMethod
,则在调用add
时会导致类型冲突。
generics不像数组那样是共变的。 由于类型擦除,这是不允许的。
考虑Vehicle
, Bike
和Car
。
如果你做
public void addVehicle(List vehicles){ vehicles.add(new Car()); }
- 这是可能的,因为
Car
是Vehicle
类型,您可以将Car
添加到Vehicle
因为它通过了IS-A测试。 - 但是如果允许将
List
传递给addVehicle(List
呢?vehicles)
你会添加一辆Car
到自行车列表。 这是完全错误的。 因此generics不允许这样做。
阅读有关generics的多态性