|
| 1 | +《《《 [返回首页](../README.md) <br/> |
| 2 | +《《《 [上一节](06_Multiple_Bounds.md) |
| 3 | + |
1 | 4 | ## 桥梁
|
2 | 5 |
|
3 |
| -正如我们前面提到的,泛型是通过擦除来实现的:当你用泛型编写代码时,它的编译方式几乎与没有泛型编写的代码完全相同。在参数化接口(如 `Comparable<T>`)的情况下,这可能会导致编译器插入其他方法;这些附加的方法被称为网桥。 |
| 6 | +正如我们前面提到的,泛型是通过擦除来实现的:当你用泛型编写代码时,它的编译方式几乎与没有泛型编写的代码完全相同。在参数化接口(如 `Comparable<T>`)的 |
| 7 | +情况下,这可能会导致编译器插入其他方法;这些附加的方法被称为网桥。 |
4 | 8 |
|
5 |
| -示例 `3-6` 显示了 `Comparable` 接口以及泛型之前的 `Java` 中的 `Integer` 类的简化版本。在非通用接口中,`compareTo` 方法接受一个 `Object` 类型的参数。在非泛型类中,有两个 `compareTo` 方法。第一个是您可能期望的简单方法,用于将整数与另一个整数进行比较。第二个将整数与任意对象进行比较:它将该对象转换为整数并调用第一个方法。第二种方法对于重写 `Comparable` 接口中的 `compareTo` 方法是必需的,因为只有当方法签名相同时才会覆盖。这第二种方法被称为桥梁。 |
| 9 | +示例 `3-6` 显示了 `Comparable` 接口以及泛型之前的 `Java` 中的 `Integer` 类的简化版本。在非通用接口中,`compareTo` 方法接受一个 `Object` 类型的 |
| 10 | +参数。在非泛型类中,有两个 `compareTo` 方法。第一个是您可能期望的简单方法,用于将整数与另一个整数进行比较。第二个将整数与任意对象进行比较:它将该对 |
| 11 | +象转换为整数并调用第一个方法。第二种方法对于重写 `Comparable` 接口中的 `compareTo` 方法是必需的,因为只有当方法签名相同时才会覆盖。这第二种方法被称 |
| 12 | +为桥梁。 |
6 | 13 |
|
7 |
| -例 `3-7` 显示了当 `Comparable` 接口和 `Integer` 类被基因化时发生了什么。在通用接口中,`compareTo` 方法接受 `T` 类型的参数。在泛型类中,单个 `compareTo` 方法接受 `Integer` 类型的参数。 |
| 14 | +例 `3-7` 显示了当 `Comparable` 接口和 `Integer` 类被基因化时发生了什么。在通用接口中,`compareTo` 方法接受 `T` 类型的参数。在泛型类中,单个 |
| 15 | +`compareTo` 方法接受 `Integer` 类型的参数。 |
8 | 16 |
|
9 | 17 | 桥接方法由编译器自动生成。 事实上,这两个示例的编译版本的代码基本相同。
|
10 | 18 |
|
11 |
| -例3-6。 传统的可比较整数的代码 |
| 19 | +例 `3-6`。 传统的可比较整数的代码 |
12 | 20 |
|
13 | 21 | ```java
|
14 | 22 | interface Comparable {
|
|
26 | 34 | }
|
27 | 35 | ```
|
28 | 36 |
|
29 |
| -例3-7。 可比较整数的通用代码 |
| 37 | +例 `3-7`。 可比较整数的通用代码 |
30 | 38 |
|
31 | 39 | ```java
|
32 | 40 | interface Comparable<T> {
|
|
49 | 57 | System.out.println(m.toGenericString());
|
50 | 58 | ```
|
51 | 59 |
|
52 |
| -在通用版本的Integer类上运行此代码会产生以下输出: |
| 60 | +在通用版本的 `Integer` 类上运行此代码会产生以下输出: |
53 | 61 |
|
54 | 62 | ```java
|
55 | 63 | public int Integer.compareTo(Integer)
|
56 | 64 | public bridge int Integer.compareTo(java.lang.Object)
|
57 | 65 | ```
|
58 | 66 |
|
59 |
| -这确实包含两种方法,一种是采用 `Integer` 类型参数的声明方法,另一种是采用 `Object` 类型参数的桥接方法。 (截至撰写本文时,`Sun JVM` 打印的是 `volatile` 而不是 `bridge`,因为`Java` 字节码中用于指示网桥方法的位也用于指示易失性字段;预计此错误将在未来版本中得到修复。) |
| 67 | +这确实包含两种方法,一种是采用 `Integer` 类型参数的声明方法,另一种是采用 `Object` 类型参数的桥接方法。 (截至撰写本文时,`Sun JVM` 打印的是 |
| 68 | +`volatile` 而不是 `bridge`,因为`Java` 字节码中用于指示网桥方法的位也用于指示易失性字段;预计此错误将在未来版本中得到修复。) |
60 | 69 |
|
61 | 70 | 将旧版代码转换为使用泛型时,网桥可以发挥重要作用; 见 `8.4` 节。
|
62 | 71 |
|
63 |
| - |
64 |
| - |
65 |
| - |
66 |
| - |
67 |
| - |
68 |
| - |
69 |
| - |
70 |
| - |
71 |
| - |
72 |
| - |
73 |
| - |
74 |
| - |
75 |
| - |
76 |
| - |
77 |
| - |
78 |
| - |
79 |
| - |
80 |
| - |
81 |
| - |
82 |
| - |
83 |
| - |
84 |
| - |
85 |
| - |
86 |
| - |
87 |
| - |
88 |
| - |
89 |
| - |
90 |
| - |
91 |
| - |
92 |
| - |
93 |
| - |
94 |
| - |
95 |
| - |
96 |
| - |
97 |
| - |
98 |
| - |
99 |
| - |
| 72 | +《《《 [下一节](08_Covariant_Overriding.md) <br/> |
| 73 | +《《《 [返回首页](../README.md) |
0 commit comments