文档

Java™ 教程
隐藏目录
通配符和子类型
路径:学习Java语言
课程:泛型(已更新)
章节:通配符

通配符和子类型

泛型、继承和子类型所述,泛型类或接口之间的关系并不仅仅因为它们的类型之间存在关系。然而,你可以使用通配符来创建泛型类或接口之间的关系。

给定以下两个普通(非泛型)类:

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;   // 编译错误

鉴于Integer是Number的子类型,List<Integer>和List<Number>之间的关系是什么?

显示List<Number>和List<Integer>的共同父级是未知类型的列表的图表
共同的父级是List<?>。

虽然Integer是Number的子类型,但List<Integer>不是List<Number>的子类型,实际上,这两个类型之间没有关系。List<Number>和List<Integer>的共同父级是List<?>。

为了在这些类之间创建关系,以便代码可以通过List<Integer>的元素访问Number的方法,请使用上界通配符:

List<? extends Integer> intList = new ArrayList<>();
List<? extends Number>  numList = intList;  // OK. List<? extends Integer>是List<? extends Number>的子类型

因为Integer是Number的子类型,numList是Number对象的列表,现在intList(Integer对象的列表)和numList之间存在关系。以下图表显示了声明使用上界和下界通配符的多个List类之间的关系。

显示List<Integer>是List<? extends Integer>和List<? super Integer>的子类型。List<? extends Integer>是List<? extends Number>的子类型,List<? extends Number>是List<?>的子类型。List<Number>是List<? super Number>和List>? extends Number>的子类型。List<? super Number>是List<? super Integer>的子类型,List<? super Integer>是List<?>的子类型的图表。
一系列泛型List类声明的层次结构。

通配符使用指南部分有关于使用上界和下界通配符的影响的更多信息。


上一页:下限通配符
下一页:通配符捕获和辅助方法