125.md 2.1 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4
# 上限有界的通配符

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

W
wizardforcel 已提交
5
您可以使用上限通配符来放宽对变量的限制。例如,假设您要编写一个适用于`List< Integer>的方法。``列表< Double>`*和 _ `列表< Number>` ;你可以通过使用上限的通配符来实现这一点。
W
init  
wizardforcel 已提交
6

W
wizardforcel 已提交
7
要声明一个上限通配符,使用通配符('`?`'),然后是`extends`关键字,然后是*上限*。注意,在这种情况下,`扩展`在一般意义上用于表示“扩展”(如在类中)或“实现”(如在接口中)。
W
init  
wizardforcel 已提交
8

W
wizardforcel 已提交
9
编写适用于`编号`列表和`编号`的子类型的方法,如`整数``Double``浮动`,你要指定`List<? extends Number>` 。术语`列表<数字>``List<?更具限制性 extends Number>`因为前者仅匹配类型`号`的列表,而后者匹配类型`号`或其任何子类的列表。
W
init  
wizardforcel 已提交
10 11 12

考虑以下`过程`方法:

W
wizardforcel 已提交
13
```java
W
init  
wizardforcel 已提交
14 15 16 17
public static void process(List<? extends Foo> list) { /* ... */ }

```

W
wizardforcel 已提交
18
上限通配符,`<?延伸 Foo>` ,其中`Foo`是任何类型,匹配`Foo``Foo`的任何子类型。 `进程`方法可以访问列表元素`Foo`
W
init  
wizardforcel 已提交
19

W
wizardforcel 已提交
20
```java
W
init  
wizardforcel 已提交
21 22 23 24 25 26 27 28
public static void process(List<? extends Foo> list) {
    for (Foo elem : list) {
        // ...
    }
}

```

W
wizardforcel 已提交
29
`foreach`子句中, `elem`变量迭代列表中的每个元素。 `Foo`类中定义的任何方法现在都可用于`elem`
W
init  
wizardforcel 已提交
30

W
wizardforcel 已提交
31
`sumOfList`方法返回列表中数字的总和:
W
init  
wizardforcel 已提交
32

W
wizardforcel 已提交
33
```java
W
init  
wizardforcel 已提交
34 35 36 37 38 39 40 41 42
public static double sumOfList(List<? extends Number> list) {
    double s = 0.0;
    for (Number n : list)
        s += n.doubleValue();
    return s;
}

```

W
wizardforcel 已提交
43
以下代码使用`Integer`对象列表打印`sum = 6.0`
W
init  
wizardforcel 已提交
44

W
wizardforcel 已提交
45
```java
W
init  
wizardforcel 已提交
46 47 48 49 50
List<Integer> li = Arrays.asList(1, 2, 3);
System.out.println("sum = " + sumOfList(li));

```

W
wizardforcel 已提交
51
`Double`值列表可以使用相同的`sumOfList`方法。以下代码打印`sum = 7.0`
W
init  
wizardforcel 已提交
52

W
wizardforcel 已提交
53
```java
W
init  
wizardforcel 已提交
54 55 56 57
List<Double> ld = Arrays.asList(1.2, 2.3, 3.5);
System.out.println("sum = " + sumOfList(ld));

```