泛型知识点及泛型机制详解要点

作者: imule 分类: Java备忘 发布时间: 2023-02-10 11:35

泛型知识点要点

1.泛型的限定符为extends

2.泛型通配符,常用的有T、E、K、V、?

  • 设定泛型通配符上边界:
  • 设定泛型通配符下边界:

3.T 是一个 确定的类型,通常用于泛型类和泛型方法的定义,?是一个 不确定的类型,通常用于泛型方法的调用代码和形参,不能用于定义类和泛型方法

4.使用泛型有三个步骤:定义类型变量、使用类型变量、确定类型变量

泛型机制详解要点

1.泛型的类型擦除:

1) 泛型的类型擦除原则:

  1. 消除类型参数声明,即删除<>及其包围的部分
  2. 根据类型参数的上下界推断并替换所有的类型参数为原生态类型:
    • 如果类型参数是无限制通配符或没有上下界限定则替换为Object
    • 如果存在上下界限定则根据子类替换原则取类型参数的最左边限定类型(即父类)
  3. 为了保证类型安全,必要时插入强制类型转换代码
  4. 自动产生“桥接方法”以保证擦除类型后的代码仍然具有泛型的“多态性”

2) 证明类型擦除:

原始类型相等:

  • 实例化ArrayList,变量名为list1
  • 实例化ArrayList,变量名为list2
  • list1.getClass() == list2.getClass()//true Stirng和Integer类型被擦除,保留原始类型

反射添加其它类型元素:

  • 实例化ArrayList,变量名为list
  • list.getClass().getMethod("add", Object.class).invoke(list, "asd");
  • //可以顺利存储,Integer类型被擦除,保留原始类型

2.泛型的类型检查:

1) 泛型类型检查是在编译时完成的,泛型变量的使用是会在编译之前检查的;

2) 泛型类型检查就是针对引用的,谁是一个引用,用这个引用调用泛型方法,就会对这个引用调用的方法进行类型检测,而无关它真正引用的对象;

3.我们没有ArrayList,只有ArrayList, 为何?

1) 因为当类型擦除后,ArrayList的原始类型变为Object,但是Object类型不能存储int值,只能引用Integer的值。

2) 需要注意,我们能够使用list.add(1)是因为Java基础类型的自动装箱拆箱操作。

4.泛型的静态变量和静态方法:

泛型类中的静态方法和静态变量不可以使用泛型类所声明的泛型类型参数

因为泛型类中的泛型参数的实例化是在定义对象的时候指定的,而静态变量和静态方法不需要使用对象来调用。对象都没有创建,如何确定这个泛型参数是何种类型,所以当然是错误的。
  • public static T one; //编译错误 ,T是泛型类中的
  • public static T show(T one){} //编译错误 ,T是泛型类中的
  • public static T show(T one){} //这是正确的,T是自己方法定义的

5.泛型存在类型擦除,如何获取泛型的参数类型呢?

可以通过反射(java.lang.reflect.Type)获取泛型

寄语

    有人在奔跑,有人在睡觉,有人在感恩,有人在抱怨,有目标的睡不着,没目标的睡不醒,努力才是人生应有的态度,睁开眼就是新的开始。

本站文章主要用于个人学习记录,可能对您有所帮助,仅供参考!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!