Java泛型实现机制

  • 原理

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

  • 类型擦除的好处

    • 运行时内存负担小

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

    • 兼容性好

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

  • 类型擦除的问题

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

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

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

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

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

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

      如上这种是不可行的。

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

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

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

    • 运行时类型强转开销

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

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

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

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

      List<String> strs = new ArrayList();
      strs.add("str");
      String val = strs.get(0);
      
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容