Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
你可以使用上界通配符来放宽对变量的限制。例如,假设你要编写一个适用于 List<Integer>,List<Double>,and List<Number> 的方法;你可以通过使用上界通配符来实现这一点。
要声明上界通配符,请使用通配符( '?' ),然后使用 extends 关键字,后跟 upper bound (上界) 。请注意,在此上下文中,extends 在一般意义上用于表示 "继承" (如在类中)或 "实现" (如在接口中)。
要编写适用于 Number 类型的列表和 Number 子类型(例如 Integer,Double,和 Float)的列表的方法,你可以指定 List<? extends Number>。术语 List<Number> 比 List<? extends Number> 更具限制性,因为前者仅匹配类型 Number 的列表,而后者匹配类型 Number 或其任何子类的列表。
请考虑以下 process 方法:
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));