Java泛型实现机制

  • 原理

    Java泛型是通过类型擦除来实现。

  • 类型擦除的好处

    • 运行时内存负担小

      诸如List、List等在运行时只会存在List一个类型。

    • 兼容性好

      Java新增泛型(1.5)之后的版本可以兼容老版本的原始类型。

  • 类型擦除的问题

    • 泛型参数不能使用基本类型

      不能使用如List的类型,只能使用List等,存在装箱和拆箱的开销。

    • 泛型类型无法用作方法重载

      void foo(List list)和void foo(List list)的参数类型在编译完成后都是List。

    • 泛型类型无法当作真实类型使用

         void foo(T t){
              T instance = new T();
              T[] arr = new T[1];
              Class c = T.class;
              List list = new ArrayList<>();
              if(list instanceOf List<某类型>){}
          }
      

      如上这种是不可行的。

    • 静态方法无法引用类泛型参数

      类的泛型参数只有类实例化的时候才知道是什么类型。

      静态方法若要使用泛型,一般在方法上声明一个泛型类型,如static S foo(S s) {}

    • 运行时类型强转开销

      泛型出现(1.5)之前,手动强转:

      List strs = new ArrayList();
      strs.add("str");
      String val = (String)strs.get(0);
      

      泛型出现(1.5)之后,自动强转:

      原因:编译完成后类型被擦除。

      List strs = new ArrayList();
      strs.add("str");
      String val = strs.get(0);
      

你可能感兴趣的:(Java泛型实现机制)