File tree Expand file tree Collapse file tree 1 file changed +2
-2
lines changed Expand file tree Collapse file tree 1 file changed +2
-2
lines changed Original file line number Diff line number Diff line change 12
12
13
13
` C++ ` 和` C# ` 是使用` Code specialization ` 的处理机制,前面提到,他有一个缺点,那就是** 会导致代码膨胀** 。另外一个弊端是在引用类型系统中,浪费空间,因为引用类型集合中元素本质上都是一个指针。没必要为每个类型都产生一份执行代码。而这也是Java编译器中采用` Code sharing ` 方式处理泛型的主要原因。
14
14
15
- ` Java ` 编译器通过` Code sharing ` 方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过** 类型擦除** (` type erasue ` )实现的。
15
+ ` Java ` 编译器通过` Code sharing ` 方式为每个泛型类型创建唯一的字节码表示,并且将该泛型类型的实例都映射到这个唯一的字节码表示上。将多种泛型类形实例映射到唯一的字节码表示是通过** 类型擦除** (` type erasure ` )实现的。
16
16
17
17
* * *
18
18
19
19
### 二、什么是类型擦除
20
20
21
- 前面我们多次提到这个词:** 类型擦除** (` type erasue ` ),那么到底什么是类型擦除呢?
21
+ 前面我们多次提到这个词:** 类型擦除** (` type erasure ` ),那么到底什么是类型擦除呢?
22
22
23
23
> 类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清除类型参数的相关信息,并且再必要的时候添加类型检查和类型转换的方法。 类型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。 类型擦除的主要过程如下: 1.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。(这部分内容可以看:[ Java泛型中extends和super的理解] [ 2 ] ) 2.移除所有的类型参数。
24
24
You can’t perform that action at this time.
0 commit comments