# 上限有界的通配符

> 原文： [https://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html](https://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html)

您可以使用上限通配符来放宽对变量的限制。例如，假设您要编写一个适用于 `List&lt; Integer&gt;的方法。` ，`列表&lt; Double&gt;` ，_ 和 _ `列表&lt; Number&gt;` ;你可以通过使用上限的通配符来实现这一点。

要声明一个上限通配符，使用通配符（'`？`'），然后是 `extends` 关键字，然后是 _ 上限 _。注意，在这种情况下，`扩展`在一般意义上用于表示“扩展”（如在类中）或“实现”（如在接口中）。

编写适用于`编号`列表和`编号`的子类型的方法，如`整数`， `Double` 和`浮动`，你要指定 `List&lt;？ extends Number&gt;` 。术语`列表&lt;数字&gt;` 比 `List&lt;？更具限制性 extends Number&gt;` 因为前者仅匹配类型`号`的列表，而后者匹配类型`号`或其任何子类的列表。

考虑以下`过程`方法：

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

```

上限通配符，`&lt;？延伸 Foo&gt;` ，其中 `Foo` 是任何类型，匹配 `Foo` 和 `Foo` 的任何子类型。 `进程`方法可以访问列表元素 `Foo` ：

```
public static void process(List<? extends Foo> list) {
    for (Foo elem : list) {
        // ...
    }
}

```

在 `foreach` 子句中， `elem` 变量迭代列表中的每个元素。 `Foo` 类中定义的任何方法现在都可用于 `elem` 。

`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));

```