|
31 | 31 | 事实上,从上面两个来源编译的字节码将是相同的。我们说泛型是通过擦除来实现的,因为类型 `List<Integer>`,`List<String>` 和 `List<List<String>`都
|
32 | 32 | 在运行时由相同的类型 `List`。我们还使用**类型擦除**来描述将第一个程序转换为第二个程序的过程。术语擦除是一个轻微的误称,因为该过程擦除了类型参数但增
|
33 | 33 | 加了代码。
|
34 |
| -- 泛型隐式执行没有泛型明确执行的相同的强制转换。如果使用这样转换可能会失败,可能很难调试使用泛型编写的代码。 这就是为什么可以肯定泛型具有以下保证: |
35 |
| - > 保证:通过泛型编译添加的隐式转换从不失败。 |
36 |
| -- 这个保证也有一些细小的瑕疵:只有在没有检查的情况下才适用编译器发出警告。 后来我们会详细讨论一下导致发出未经检查的警告以及如何最小化其影响。 |
37 |
| -- 通过实现泛型擦除有一些重要的影响。 它保持编写简单,在泛型不添加任何根本的新东西。 它使代码变得简单,因为`List`只有一个实现,而不是每个类型的一个 |
38 |
| -版本。 同时它简化了版本升级,因为可以在非泛型和泛型中访问同一个库形式。 |
39 |
| -- 最后值得阐述一点。 这意味着你不会由于维护两个版本的库而烦恼:一个非通用的旧版本的作品与`Java1.4`或更早版本,以及与`Java5`和`6`一起工作的通用版本 |
40 |
| -,与不使用泛型的代码看起来一样。 无需一次切换到泛型,只需更新即可演变您的代码一个程序包,一个类或一个方法开始使用泛型。 我们甚至解释您如何可以为遗留 |
41 |
| -的代码声明泛型类型。 (当然,仅保证当您添加与传统代码相匹配的泛型类型时,上述提及才有效。) |
42 |
| -- 通过类型擦除来实现泛型的另一个结果是数组类型不同参数化类型的关键。执行 |
43 |
| - ```java |
44 |
| - new String[size] |
45 |
| - ``` |
46 |
| - 分配一个数组,并在该数组中存储一个指定其组件是类型是字符串。 相反,执行: |
| 34 | + |
| 35 | + 泛型隐式执行没有泛型明确执行具有相同的强制转换。使用这样转换可能会失败,可能很难调试使用泛型编写的代码。这就是为什么可以肯定泛型具有以下保证: |
| 36 | + > 保证:通过泛型编译添加的隐式转换从不失败。 |
| 37 | + |
| 38 | + 这个保证也有一些细小的瑕疵:只有在没有检查的情况下才适用编译器发出警告。后面我们会详细讨论一下导致发出未经检查的警告以及如何最小化其影响。 |
| 39 | + |
| 40 | + 通过实现泛型擦除有一些重要的影响。它保持编写简单,在泛型不添加任何的新东西。它使代码变得简单,因为 `List` 只有一个实现,而不是每个类型的一个版 |
| 41 | +本。同时它简化了版本升级,因为可以在非泛型和泛型中访问同一个库形式。 |
| 42 | + |
| 43 | + 最后值得阐述一点。这意味着你不会由于维护两个版本的库而烦恼:一个非通用的旧版本的作品与 `Java1.4` 或更早版本,以及与 `Java5` 和 `6` 一起工作的通 |
| 44 | +用版本,与不使用泛型的代码看起来一样。无需一次切换到泛型,只需更新即可演变您的代码一个程序包,一个类或一个方法开始使用泛型。我们甚至解释您如何可以 |
| 45 | +为遗留的代码声明泛型类型。(当然,仅保证当您添加与传统代码相匹配的泛型类型时,上述提及才有效。) |
| 46 | + |
| 47 | + 通过类型擦除来实现泛型的另一个结果是数组类型不同参数化类型的关键。执行 |
| 48 | + |
| 49 | +```java |
| 50 | + new String[size] |
| 51 | +``` |
| 52 | + |
| 53 | + 分配一个数组,并在该数组中存储一个指定其组件是类型是字符串。 相反,执行: |
| 54 | + |
47 | 55 | ```java
|
48 | 56 | new ArrayList<String>()
|
49 |
| - ``` |
| 57 | + ``` |
| 58 | + |
50 | 59 | 分配一个列表,但不在列表中存储任何元素类型的指定。在行话中,我们说`Java`会将数组元素类型作为数据类型,但并不是指定数组元素的类型元素类型(或其他通
|
51 | 60 | 用类型)。 稍后,我们将看到这个设计如何缓解进化(见第5章),仅仅强制转换,实例测试和数组创建(见第6章)。
|
52 | 61 | - 泛型与模板`Java`中的泛型类似于`C++`中的模板。有关于`Java`泛型之间的关系需要牢记两件重要的事情和`C++`模板:语法和语义。
|
|
0 commit comments