上界通配符

Author Avatar
贾康 11月 11, 2016

###上界通配符
我们可以使用上界通配符来放松对变量的限制。举例来说,如果你想写一个适用在List<Integer>, List<Double>, 和 List<Number>上的方法,你可以通过上界通配符来实现。
为了声明一个上界通配符,使用通配符‘?’,然后是extends关键字。再然后是上界。注意在此extends既指继承也指实现。
List<? extends Number>可以适用于List<Integer>, List<Double>,但是List<Number>只适用于但是List<Number>
考虑process方法如下:

1
public static void process(List<? extends Foo> list) { /* ... */ }

上界通配符<? extends Foo>适用于Foo和Foo的所有子类。process方法可以访问关于Foo的list

1
2
3
4
5
public static void process(List<? extends Foo> list) {
for (Foo elem : list) {
// ...
}
}

sumOfList方法返回list中所有元素的和:

1
2
3
4
5
6
public static double sumOfList(List<? extends Number> list) {
double s = 0.0;
for (Number n : list)
s += n.doubleValue();
return s;
}

以下代码使用一个Integer的list,会输出sum=6.0:

1
2
List<Integer> li = Arrays.asList(1, 2, 3);
System.out.println("sum = " + sumOfList(li));

同样也可以使用double,以下的代码输出sum=7.0

1
2
List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));

下一页