Java教程是为JDK 8编写的。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言特性的摘要,请参见Java语言更改。
有关所有JDK版本的新功能、增强功能以及删除或弃用选项的信息,请参见JDK发行说明。
您可以使用上界通配符来放宽对变量的限制。例如,假设您想编写一个可以在 List<Integer>、List<Double> 和 以及 List<Number> 上工作的方法;您可以通过使用上界通配符来实现这一点。
要声明上界通配符,请使用通配符字符('?'),后跟 extends 关键字,后跟其 上界。请注意,在此上下文中,extends 通常用于泛指 "extends"(用于类)或 "implements"(用于接口)。
要编写适用于 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));