5

鉴于此代码段

    //Creates a list of List numbers
    List<List<Number>> num = new ArrayList<List<Number>>();
    //Creates a list of List doubles
    List<List<Double>> doub = new ArrayList<List<Double>>();
    //List of doubles
    List<Double> d = new ArrayList<Double>();
    d.add(2.5);
    d.add(2.6);
    doub.add(d);

    num.add(d);//This code will not compile

为什么不允许 num.add(doub) ?不是List<List<Number>>超级类型 List<List<Double>>吗?

4

4 回答 4

6

泛型继承与我们对继承的理解差别不大。如果您想使用子类类型,您需要在泛型中使用 extends(或)super来定义边界(通配符)。

在此处输入图像描述

于 2012-08-30T14:51:06.193 回答
1

您正在尝试将列表列表添加到带有列表的列表中。(不是在我看到的编辑之后)

或者可能不那么令人困惑:

Your num list can only add List<Number>, you are trying to add a List<List<Double>>.

此外,使用泛型进行继承也不起作用,即使您确实添加了双精度列表,它也不起作用。

如果你这样定义 num :

    List<List<? extends Number>> num = new ArrayList<List<? extends Number>>();

然后你将能够做到这一点:

    num.add(d);

但不是:

    num.add(doub);
于 2012-08-30T14:53:04.820 回答
0

List<Double>List<Number>就编译器关心的部分而言,这与它没有任何关系List<>

因此,Java Generics 系统List<List<Double>>不继承自List<List<Number>>它们是两个完全不同的类型。这不是extends构建类时的关系。

于 2012-08-30T14:53:13.747 回答
0

给定声明的类型,doub.add(d)num.add(doub)暗示add(). 如果doub.add(d)有效,我也不希望num.add(doub)这样做。

你是不是想测试一下

num.add(d)

代替

num.add(doub)

?

于 2012-08-30T15:01:21.587 回答