5

我想知道为什么List<Number>不能用List<Integer> 调用 not 甚至 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>......所以我不需要我想知道确切原因的解决方案。

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

4

2 回答 2

11

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

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

如果允许您myMethod使用 this 的实例进行调用,则在调用时List<Integer>会导致类型冲突add

于 2013-08-29T14:44:32.740 回答
8

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

考虑VehicleBikeCar

如果你做

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

你会添加一个Car自行车清单。这是完全错误的。所以泛型不允许这样做。

阅读有关泛型的多态性

于 2013-08-29T14:48:29.707 回答