# 上限有界的通配符 > 原文: [https://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html](https://docs.oracle.com/javase/tutorial/java/generics/upperBounded.html) 您可以使用上限通配符来放宽对变量的限制。例如,假设您要编写一个适用于`List< Integer>的方法。` ,`列表< Double>` ,*和 _ `列表< Number>` ;你可以通过使用上限的通配符来实现这一点。 要声明一个上限通配符,使用通配符('`?`'),然后是`extends`关键字,然后是*上限*。注意,在这种情况下,`扩展`在一般意义上用于表示“扩展”(如在类中)或“实现”(如在接口中)。 编写适用于`编号`列表和`编号`的子类型的方法,如`整数`, `Double`和`浮动`,你要指定`List<? extends Number>` 。术语`列表<数字>`比`List<?更具限制性 extends Number>`因为前者仅匹配类型`号`的列表,而后者匹配类型`号`或其任何子类的列表。 考虑以下`过程`方法: ```java public static void process(List list) { /* ... */ } ``` 上限通配符,`<?延伸 Foo>` ,其中`Foo`是任何类型,匹配`Foo`和`Foo`的任何子类型。 `进程`方法可以访问列表元素`Foo` : ```java public static void process(List list) { for (Foo elem : list) { // ... } } ``` 在`foreach`子句中, `elem`变量迭代列表中的每个元素。 `Foo`类中定义的任何方法现在都可用于`elem` 。 `sumOfList`方法返回列表中数字的总和: ```java public static double sumOfList(List list) { double s = 0.0; for (Number n : list) s += n.doubleValue(); return s; } ``` 以下代码使用`Integer`对象列表打印`sum = 6.0` : ```java List li = Arrays.asList(1, 2, 3); System.out.println("sum = " + sumOfList(li)); ``` `Double`值列表可以使用相同的`sumOfList`方法。以下代码打印`sum = 7.0` : ```java List ld = Arrays.asList(1.2, 2.3, 3.5); System.out.println("sum = " + sumOfList(ld)); ```