主要记录个人对<? extends T>,<? super T>的理解和使用
接下来均以ArrayList为例。
本文所总结的均为编译层面上的规则。
第一个问题:引用间的赋值
- 4种泛型引用
1.空引用ArrayList<>,ArrayList
2.一般引用,即指定具体的泛型 ArrayList,ArrayList
3.ArrayList<? extends A>
4.ArrayList<? super A>
这4种引用能否相互赋值的规则通过代码可以看出:(相同引用可以随便赋)
其中A是B的父类
第二个问题:对于上述四种引用,其方法的调用问题
-
方法的种类
1.方法的形参中有类型为指定泛型的。例如ArrayList的add方法,以下简称一号方法
2.方法的返回值类型为指定泛型的。例如ArrayList的get方法,以下简称二号方法 -
四种引用种类对应的解决
-
空引用
一号方法中类型是泛型的参数可以传入任意对象(所有对象都是Object类或者子类)。
二号方法中返回值接收时指定的变量引用必定指定为Object,否则编译失败。
-
一般引用
一号方法中类型是泛型的参数可以传入任意指定泛型类或者指定泛型类子类对象。
二号方法中返回值接收时指定的变量引用必定指定为指定的泛型类或者指定泛型类父类,否则编译失败。
(这就是最一般的使用) - <? extends T>
一号方法无论传入任何类型对象均编译失败
二号方法中返回值接收时指定的变量引用必定指定为T或者T父类,否则编译失败
- <? super T>
一号方法中类型是泛型的参数可以传入T类或者T类子类对象。
二号方法中返回值接收时指定的变量引用必定指定Object类,否则编译失败