Wildcards and Subtyping
Last updated
Last updated
在Generics, Inheritance, and Subtypes已经讨论过,泛型类或者接口之所以是不相关仅因为它们的类型之间存在关系。然而,你可以用通配符去创建泛型类或者接口之间的关系。
以下面两个常规(非泛型)类为例:
下面的代码也是合理的:
上面上代码显示了常规类的继承遵循了子类型规则:如果B
扩展自A
,则类B
是类A
的子类型。该规则不适用于泛型类型:
既然Integer
是Number
的子类型,那么List <Integer>
和List <Number>
之间的关系是什么呢?
虽然Integer
是Number
的子类型,但是List<Integer>
不是List<Number>
的子类型,实际上,这两个类型并没有关联。List<Number>
和List<Integer>
的共同父类是List<?>
为了在这些类之间创建关系,以便代码可以通过List <Integer>
的元素访问Number
的方法,请使用上界通配符:
因为Integer
是Number
的子类型,并且numList
是Number
对象的列表,所以现在intList
(Integer对象的列表)和numList
之间存在关系。下图展示了了使用上下界通配符声明的几个List
类之间的关系。
Guidelines for Wildcard Use部分提供有更多关使用上界和下界通配符的后果的信息