Java 方法声明中的通配符与超类型

Java 方法声明中的通配符与超类型,java,wildcard,Java,Wildcard,有人能解释一下为什么我们会使用?扩展…。对我来说,每当我想在代码中指定这样的条件时,似乎总是可以使用超级类型。例如,?扩展编号始终可以替换为编号对吗 考虑以下几点 public static double numberAdd(List<Number> list) { double sum = 0; for (Number x : list) { sum += x.doubleValue(); } return sum; } publi

有人能解释一下为什么我们会使用
?扩展…
。对我来说,每当我想在代码中指定这样的条件时,似乎总是可以使用超级类型。例如,
?扩展编号
始终可以替换为编号对吗

考虑以下几点

public static double numberAdd(List<Number> list) {
    double sum = 0;
    for (Number x : list) {
        sum += x.doubleValue();
    }
    return sum;
}
public静态双代号(列表){
双和=0;
用于(编号x:列表){
sum+=x.doubleValue();
}
回报金额;
}
vs

publicstaticdoublegenericadd(List
numberAdd(List List)
只接受一个
列表


genericAdd(ListWhat if you want generally add a
List
?尝试这两种方法,看看会发生什么。第一种方法只接受类型为
List
的参数,第二种方法将接受类型扩展为
Number
的任何列表(
List
List
等)。请看-我的关于这个主题的信息。谢谢。这篇文章准确地描述了我困惑的根源。谢谢你,我尝试了你的建议,但有明显的不同。这篇文章解释了这种行为的原因。我会在你的回答让我接受后立即标记你的答案
public static double genericAdd(List<? extends Number> list) {
    double sum = 0;
    for (Number x : list) {
        sum += x.doubleValue();
    }
    return sum;
}