文档

Java™ 教程-Java Tutorials 中文版
上界通配符
Trail: Learning the Java Language
Lesson: Generics (Updated)
Section: Wildcards

上界通配符

你可以使用上界通配符来放宽对变量的限制。例如,假设你要编写一个适用于 List<Integer>List<Double>and List<Number> 的方法;你可以通过使用上界通配符来实现这一点。

要声明上界通配符,请使用通配符( '?' ),然后使用 extends 关键字,后跟 upper bound (上界) 。请注意,在此上下文中,extends 在一般意义上用于表示 "继承" (如在类中)或 "实现" (如在接口中)。

要编写适用于 Number 类型的列表和 Number 子类型(例如 IntegerDouble,和 Float)的列表的方法,你可以指定 List<? extends Number>。术语 List<Number>List<? extends Number> 更具限制性,因为前者仅匹配类型 Number 的列表,而后者匹配类型 Number 或其任何子类的列表。

请考虑以下 process 方法:

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

上界通配符,<? extends Foo>,其中 Foo 是任何类型,匹配 FooFoo 的任何子类型。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));

Previous page: Wildcards
Next page: Unbounded Wildcards