Java Generic <9. Wildcards and Subtyping> Reading the oracle tutorial
by libai8723
当我们使用通配符号的时候,子类型之间的关系
一、我们知道parameterized type之间基本是没有关系的
意思就是List
如果我们想让泛型类型有父类和子类的关系的话,之前的章节说了,要保证type parameter是同一种类型的基础上
使用extends和implements来扩展或者实现基类,比如Collection
二、使用通配符也可以实现另外一种父类和子类的关系。
比如
List<? extends Integer> intList = new ArrayList<>();
List<? extends Number> numList = intList; // OK. List<? extends Integer> is a subtype of List<? extends Number>
因为使用了通配符,所以numList可以接受 List<Number>和List<Integer>,所以就实现了一种父类和子类的关系
下面给了一张图,可以好好理解一下
+------------+
| |
| List<?> |
| |
+-----+------+
^
+------------------------+----------------------+
| |
+-----------+---------------+ +------------+--------------+
| | | |
| List<? extends Number> +<-------+ | List<? super Integer > |
| | | +---->+ |
+------------+--------------+ | | +-------------+-------------+
^ | | ^
| | | |
| | | |
+------------+--------------+ | | +-------------+-------------+
| | | | | |
| List<? extends Integer> | | | | List<? super Number > |
| | | | | |
+------------+--------------+ +-------+ +-------------+-------------+
^ | | ^
| | | |
| | | |
+------------+--------------+ | | +-------------+-------------+
| | | | | |
| List< Integer > +----+ +---------+ List< Number > |
| | | |
+---------------------------+ +---------------------------+