# 无界的通配符

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

使用通配符（`？`）指定无界通配符类型，例如， `List&lt;？&gt;` 。这被称为未知类型的 _ 列表 _。有两种情况，无界通配符是一种有用的方法：

*   如果您正在编写可以使用 `Object` 类中提供的功能实现的方法。
*   当代码使用泛型类中不依赖于类型参数的方法时。例如， `List.size` 或 `List.clear` 。事实上， `Class&lt;？&gt;` 经常被使用，因为 `Class&lt; T&gt;中的大部分方法都是如此。` 不依赖于 `T` 。

考虑以下方法， `printList` ：

```
public static void printList(List<Object> list) {
    for (Object elem : list)
        System.out.println(elem + " ");
    System.out.println();
}

```

`printList` 的目标是打印任何类型的列表，但它无法实现该目标 - 它只打印 `Object` 实例的列表;它不能打印 `List&lt; Integer&gt;` ， `List&lt; String&gt;` ，`列表&lt; Double&gt;` ，等等，因为它们不是 `List&lt; Object&gt;的子类型。` 。要编写通用 `printList` 方法，请使用 `List&lt;？&gt;` ：

```
public static void printList(List<?> list) {
    for (Object elem: list)
        System.out.print(elem + " ");
    System.out.println();
}

```

因为对于任何具体类型 `A` ，`列表&lt; A&gt;` 是 `List&lt;？&gt;的亚型。` ，您可以使用 `printList` 打印任何类型的列表：

```
List<Integer> li = Arrays.asList(1, 2, 3);
List<String>  ls = Arrays.asList("one", "two", "three");
printList(li);
printList(ls);

```

* * *

**Note:** The [`Arrays.asList`](https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList-T...-) method is used in examples throughout this lesson. This static factory method converts the specified array and returns a fixed-size list.

* * *

重要的是要注意 `List&lt; Object&gt;` 和`列表&lt;？&gt;` 不一样。您可以将`对象`或`对象`的任何子类型插入`列表&lt; Object&gt;` 。但是你只能将 `null` 插入 `List&lt;？&gt;` 。 [通配符使用指南](wildcardGuidelines.html)部分提供了有关如何确定在给定情况下应使用哪种通配符（如果有）的更多信息。