-
原理
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...