方法声明中的通配符与 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>
,等等...
谁能解释一下为什么我们会使用 ? 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>
,等等...