# 通配符和子类型

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

如[泛型，继承和子类型](inheritance.html)中所述，泛型类或接口仅仅因为它们的类型之间存在关系而无关。但是，您可以使用通配符在泛型类或接口之间创建关系。

给定以下两个常规（非泛型）类：

```
class A { /* ... */ }
class B extends A { /* ... */ }

```

编写以下代码是合理的：

```
B b = new B();
A a = b;

```

此示例显示常规类的继承遵循此子类型规则：如果 `B` 扩展 `A` ，则类 `B` 是类 `A` 的子类型。此规则不适用于泛型类型：

```
List<B> lb = new ArrayList<>();
List<A> la = lb;   // compile-time error

```

鉴于`整数`是`数`的亚型， `List&lt; Integer&gt;之间的关系是什么？` 和 `List&lt; Number&gt;` ？

<center>![diagram showing that the common parent of List<Number> and List<Integer> is the list of unknown type](img/dc022f9377d33074da806ba77ff31bd6.jpg)</center>

<center>The common parent is `List<?>`.</center>

尽管`整数`是`数`的亚型，`列表&lt;整数&gt;` 不是 `List&lt; Number&gt;的子类型。` 而且，实际上这两种类型并不相关。 `List&lt; Number&gt;的共同父项。` 和`列表&lt;整数&gt;` 是 `List&lt;？&gt;` 。

为了在这些类之间创建关系，代码可以通过 `List&lt; Integer&gt;访问 `Number` 的方法。` 的元素，使用上限有界的通配符：

```
List<? extends Integer> intList = new ArrayList<>();
List<? extends Number>  numList = intList;  // OK. List<? extends Integer> is a subtype of List<? extends Number>

```

因为 `Integer` 是 `Number` 的子类型， `numList` 是 `Number` 对象的列表， `intList 之间现在存在关系`（`整数`对象列表）和 `numList` 。下图显示了使用上限和下限通配符声明的多个 `List` 类之间的关系。

<center>![diagram showing that List<Integer> is a subtype of both List<? extends Integer> and List<?super Integer>. List<? extends Integer> is a subtype of List<? extends Number> which is a subtype of List<?>. List<Number> is a subtype of List<? super Number> and List>? extends Number>. List<? super Number> is a subtype of List<? super Integer> which is a subtype of List<?>.](img/7e91e8f2f44799ac416b04b63ecb5570.jpg)</center>

<center>A hierarchy of several generic `List` class declarations.</center>

[通配符使用指南](wildcardGuidelines.html)部分提供了有关使用上限和下限通配符的后果的更多信息。