为什么不能用List <integer>调用List <number>,即使Integer扩展Number?</integer> </number>

时间:2013-08-29 14:39:31

标签: java generics

我想知道为什么不能用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作为新的数据结构类型绑定。

2 个答案:

答案 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)

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

考虑班级VehicleBikeCar

如果你做

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

您可以在自行车列表中添加Car。这是完全错误的。因此,泛型不允许这样做。

了解Polymorphism with generics