- 泛型的类别有两种:
- 真泛型: 在源码, 中间语言, 运行期的Common Language Runtime中都存在, 且在运行期间有自己的虚方法表和数据类型. 这种类别的实现方式是类型膨胀. 如C#;
- 伪泛型: 只在源码中存在, 在中间语言(如字节码)中被替换成原生类型(如 ArrayList为原生类型, ArrayList<String>为具体类型). 这种类别的实现方式是类型擦除. 如Java;
- Java选择类型擦除这种实现方式主要是为了支持迁移兼容性, 使类库按照它们自己的步调变成泛型, 并且这样做不会破坏依赖它的代码和应用程序
- 举个例子:
-
jdk1.4下的List类的get方法是这样的:
-
jdk1.5下的List类的get方法是这样的:
- 假设我们要获取List对象中的一个String, 在jdk1.4下调用get方法返回的是Object, 程序员需要在客户端中手动进行类型转换如: (String)get(...), 而当List类转变为泛型类后, 无需对客户端进行任何改动, 程序照常运行, 虽然(String)会变成多余的, 但不会对程序的运行产生任何影响
-
jdk1.4下的List类的get方法是这样的:
- 举个例子:
Java-Note-浅析Java泛型采用类型擦除的实现方式的原因
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在Effective中讲到泛型之处提到了一个概念,类型擦除器,这是什么呢?接下来我们跟随这篇文章探索类型擦除的...