文档

Java™教程
隐藏目录
上界通配符
路径:学习Java语言
课程:泛型(已更新)
章节:通配符

上界通配符

您可以使用上界通配符来放宽对变量的限制。例如,假设您想编写一个可以在 List<Integer>List<Double>以及 List<Number> 上工作的方法;您可以通过使用上界通配符来实现这一点。

要声明上界通配符,请使用通配符字符('?'),后跟 extends 关键字,后跟其 上界。请注意,在此上下文中,extends 通常用于泛指 "extends"(用于类)或 "implements"(用于接口)。

要编写适用于 Number 类型及其子类型(例如 IntegerDoubleFloat)列表的方法,您可以指定 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));

上一页:通配符
下一页:无界通配符