-
原理
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);
-
Java泛型实现机制
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 参考:java核心技术 一、Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型。为什么说Jav...