带有绑定类型参数的上边界通配符有什么不同?

时间:2015-12-31 06:32:23

标签: java generics wildcard

两者都用作限制机制,java文档说上限通配符将允许所有子类作为变量,而绑定类型参数只接受声明的类引用变量。

我的问题是。例如,如果我们采用Number超类并将其声明为绑定类型参数,通常它在实际场景中也会接受所有子类变量,而不管子类类型如何。那么为什么外卡呢?

1 个答案:

答案 0 :(得分:2)

根据文件The term List<Number> is more restrictive than List<? extends Number> because the former matches a list of type Number only, whereas the latter matches a list of type Number or any of its subclasses.

upperBounded

考虑这个例子

import java.util.Arrays;
import java.util.List;


public class Sample {

    public static double sumOfList(List<? extends Number> list) {
        double s = 0.0;
        for (Number n : list)
            s += n.doubleValue();
        return s;   
    }
    public static void main(String[] args) {
        List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
        System.out.println("sum = " + sumOfList(ld));
    }

}

上述工作正常,但如果您将此行更改为public static double sumOfList(List<Number> list) {

那么这一行会抱怨

System.out.println("sum = " + sumOfList(ld));将其更改为数字,即List<Number> ld或更改

或将子更改为public static double sumOfList(List<Double> list) {