两者都用作限制机制,java文档说上限通配符将允许所有子类作为变量,而绑定类型参数只接受声明的类引用变量。
我的问题是。例如,如果我们采用Number
超类并将其声明为绑定类型参数,通常它在实际场景中也会接受所有子类变量,而不管子类类型如何。那么为什么外卡呢?
答案 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.
考虑这个例子
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) {