|
| 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