您可以使用上界通配符(upper bounded wildcard)来放宽对变量的限制。例如,假设你想要写一个适用于List
要声明上界通配符,请使用通配符(’ ? ‘),后跟extend关键字,然后是其上界(upper bound)。请注意,在这种情况下,extends通常用于表示“扩展”(如在类中)或“实现”(如在接口中)。
要编写在名单工作方法数和亚型数,如整型,双和浮动,你会指定的List <?扩展Number>。术语List
要编写适用于Number列表和Number的子类型(例如Integer,Double和Float)的方法,您可以指定List<? extends Number>。 术语List
考虑以下处理方法:
public static void process(List<? extends Foo> list) { /* ... */ }
上界通配符<? extends Foo> ,其中Foo是任何类型的,匹配Foo和Foo的任何子类型。process 方法可以以Foo类型访问列表元素:
public static void process(List<? extends Foo> list) {
for (Foo elem : list) {
// ...
}
}
在foreach子句中,elem变量遍历列表中的每个元素。现在可以在elem上使用Foo类中定义的任何方法。
sumOfList方法返回一个列表中的数字的总和:
public static double sumOfList(List<? extends Number> list) {
double s = 0.0;
for (Number n : list)
s += n.doubleValue();
return s;
}
以下代码使用Integer对象的列表,输出sum = 6.0:
List<Integer> li = Arrays.asList(1, 2, 3);
System.out.println("sum = " + sumOfList(li));
Double值的列表可以使用相同的sumOfList方法。以下代码显示sum = 7.0:
List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));