一、能解决 1.参数“模板”化

  • 适用于多种数据类型执行相同的代码
  • 泛型中的类型在使用时指定
  • 泛型归根到底就是“模版”


2、使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型转换,防止程序运行时出现转换异常
3、接受宽泛的数据类型 泛型主要在集合类中使用,eg: List<String> list = new ArrayList<String>(); String s = list.get(0); //取出来的数据直接就是泛型规定的类型,不用做类型转化,从而避免类型转化异常
二、通配符 (泛指所有类型,常定义一个引用变量) 使用大寫字母A,B,C,D......X,Y,Z定義的,就都是泛型,把T換成A也一樣,這里T只是名字上的意義而已 ? 表示不確定的java類型 T (type) 表示具體的一個java類型 K V (key value) 分別代表java鍵值中的Key Value E (element) 代表Element
通配符可以使用extends和super关键字来限制:

  • List<? extends Number> 表示不确定参数类型,但必须是Number类型或者Number子类类型,这是上边界限定
  • List<? super Number> 表示不确定参数类型,但必须是Number类型或者Number的父类类型,这是下边界限定
  • List<?> 表示未受限的通配符,相当于 List<? extends Object>


注意点:

  1. 不管限定是类还是接口,统一都使用extends关键字
  2. 可以使用&符号给出多个限定,例如:<U extends Number & MyInterface1 & MyInterface2>
  3. 多个限制只能有一个类名,其他都是接口名,且类名在最前面。


PECS原则(Producer Extends Consumer Super) 1.jpg

  • Err1 对于使用" ? super T "规定泛型的数据结构,我们只知道其存储的值是T的父类,若以T为数据类型取值时 T t = ?,等于将父类(?)当做子类(T)使用,这显然是不合理的,父类缺少子类中的一些信息,因此编译器直接禁止在使用" ? super T "泛型的数据结构中进行取值,只能进行写值,正是开头所说的CS原则。

  • Err2 使用" ? extends T "规定泛型的数据结构,我们知道其存储的值是T的子类,T可以有多个不同表现的子类(多态),因此当我们进行写值时,我们并不知道其中存储的到底是哪个子类,不同子类是不同的类型,因此写值操作必然会出现问题,所以编译器接禁止在使用" ? extends T "泛型的数据结构中进行写,只能进行取值,正是开头所说的PE原则。

参考:https://www.jianshu.com/p/6db1362c50b1
三、泛型擦除 泛型的正常工作是依赖编译器在编译源码的时候,先进行类型检查,然后进行类型擦除并且在类型参数出现的地方插入强制转换的相关指令实现的。

编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息。例如List<String>在运行时仅用一个List类型来表示。为什么要进行擦除呢?这是为了避免类型膨胀。
解决泛型擦除方案 1、先检查,再编译以及编译的对象和引用传递问题 (下面使用1写法) 因为类型检查就是编译时完成的,new ArrayList()只是在内存中开辟了一个存储空间,可以存储任何类型对象,而真正设计类型检查的是它的引用,因为我们是使用它引用list1来调用它的方法,比如说调用add方法,所以list1引用能完成泛型类型的检查。而引用list2没有使用泛型,所以不行。 2.jpg 2、自动类型转换。 获取取一个泛型时会自动插入强制类型转换,如下图 4.jpg 3、类型擦除与多态的冲突和解决方法 JVM采用桥方法来解决。会生成返回值object的桥方法去调用我们复写的方法。 3.jpg

4、泛型不支持 基本数据类型 因为擦除后,都转为object了,基础类型不是对象。如果想用基础类型想用泛型得使用包装类 eg:ArrayList<Double>

5、泛型不支持 使用 instanceof 6、泛型不支持 静态方法和静态类

参考:https://blog.csdn.net/wisgood/article/details/11762427

参考: https://blog.csdn.net/u011679955/article/details/94363675?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1- https://www.jianshu.com/p/5928ff170458 https://blog.csdn.net/zz13995900221/article/details/79736057 https://segmentfault.com/a/1190000014824002 Android常用场景:适配器和数据解析(Retrofit+Rxjava) https://www.jianshu.com/p/b25966f1d699