具有绑定类型参数的上限通配符有什么区别?
What is the different between upper bound wild cards with bound type parameters?
两者都用作限制机制,java 文档说上限通配符将允许所有子 classes 作为变量,而绑定类型参数只接受声明的 class 引用仅限变量。
我的问题是。例如,如果我们采用 Number
super class 并将其声明为绑定类型参数,通常在实际情况下它也会接受所有 sub class 变量,而不管 subclass类型。那么为什么要外卡呢?
根据文档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
或更改
或将 sub 更改为 public static double sumOfList(List<Double> list) {
两者都用作限制机制,java 文档说上限通配符将允许所有子 classes 作为变量,而绑定类型参数只接受声明的 class 引用仅限变量。
我的问题是。例如,如果我们采用 Number
super class 并将其声明为绑定类型参数,通常在实际情况下它也会接受所有 sub class 变量,而不管 subclass类型。那么为什么要外卡呢?
根据文档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
或更改
或将 sub 更改为 public static double sumOfList(List<Double> list) {