方法声明中的通配符与 SuperType

Wildcards vs SuperType in method declaration

谁能解释一下为什么我们会使用 ? extends ...。对我来说,似乎只要我想在我的代码中指定这样的条件,我总是可以使用超类型。例如,? extends Number 总是可以替换为 Number 对吗?

考虑以下

public static double numberAdd(List<Number> list) {
    double sum = 0;
    for (Number x : list) {
        sum += x.doubleValue();
    }
    return sum;
}

对比

public static double genericAdd(List<? extends Number> list) {
    double sum = 0;
    for (Number x : list) {
        sum += x.doubleValue();
    }
    return sum;
}

两者做同样的事情^。您为什么要使用 List<? extends Number> 版本?

numberAdd(List<Number> list) 将只接受 List<Number>.

genericAdd(List<? extends Number> list) 将接受 List<Number>List<Integer>List<Double>,等等...