# 通配符和子类型

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

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

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

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

```

编写以下代码是合理的：

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

```

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

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

```

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

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

The common parent is `List<?>`.

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

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

```java
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`类之间的关系。

![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)

A hierarchy of several generic `List` class declarations.

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