Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Update 07_Bridges.md
  • Loading branch information
maskleo authored Apr 13, 2018
commit 6a631ab6e3d36b034b295d45d0b0454a71156e62
62 changes: 18 additions & 44 deletions ch03/07_Bridges.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,22 @@
《《《 [返回首页](../README.md) <br/>
《《《 [上一节](06_Multiple_Bounds.md)

## 桥梁

正如我们前面提到的,泛型是通过擦除来实现的:当你用泛型编写代码时,它的编译方式几乎与没有泛型编写的代码完全相同。在参数化接口(如 `Comparable<T>`)的情况下,这可能会导致编译器插入其他方法;这些附加的方法被称为网桥。
正如我们前面提到的,泛型是通过擦除来实现的:当你用泛型编写代码时,它的编译方式几乎与没有泛型编写的代码完全相同。在参数化接口(如 `Comparable<T>`)的
情况下,这可能会导致编译器插入其他方法;这些附加的方法被称为网桥。

示例 `3-6` 显示了 `Comparable` 接口以及泛型之前的 `Java` 中的 `Integer` 类的简化版本。在非通用接口中,`compareTo` 方法接受一个 `Object` 类型的参数。在非泛型类中,有两个 `compareTo` 方法。第一个是您可能期望的简单方法,用于将整数与另一个整数进行比较。第二个将整数与任意对象进行比较:它将该对象转换为整数并调用第一个方法。第二种方法对于重写 `Comparable` 接口中的 `compareTo` 方法是必需的,因为只有当方法签名相同时才会覆盖。这第二种方法被称为桥梁。
示例 `3-6` 显示了 `Comparable` 接口以及泛型之前的 `Java` 中的 `Integer` 类的简化版本。在非通用接口中,`compareTo` 方法接受一个 `Object` 类型的
参数。在非泛型类中,有两个 `compareTo` 方法。第一个是您可能期望的简单方法,用于将整数与另一个整数进行比较。第二个将整数与任意对象进行比较:它将该对
象转换为整数并调用第一个方法。第二种方法对于重写 `Comparable` 接口中的 `compareTo` 方法是必需的,因为只有当方法签名相同时才会覆盖。这第二种方法被称
为桥梁。

例 `3-7` 显示了当 `Comparable` 接口和 `Integer` 类被基因化时发生了什么。在通用接口中,`compareTo` 方法接受 `T` 类型的参数。在泛型类中,单个 `compareTo` 方法接受 `Integer` 类型的参数。
例 `3-7` 显示了当 `Comparable` 接口和 `Integer` 类被基因化时发生了什么。在通用接口中,`compareTo` 方法接受 `T` 类型的参数。在泛型类中,单个
`compareTo` 方法接受 `Integer` 类型的参数。

桥接方法由编译器自动生成。 事实上,这两个示例的编译版本的代码基本相同。

例3-6。 传统的可比较整数的代码
例 `3-6`。 传统的可比较整数的代码

```java
interface Comparable {
Expand All @@ -26,7 +34,7 @@
}
```

例3-7。 可比较整数的通用代码
例 `3-7`。 可比较整数的通用代码

```java
interface Comparable<T> {
Expand All @@ -49,51 +57,17 @@
System.out.println(m.toGenericString());
```

在通用版本的Integer类上运行此代码会产生以下输出
在通用版本的 `Integer` 类上运行此代码会产生以下输出

```java
public int Integer.compareTo(Integer)
public bridge int Integer.compareTo(java.lang.Object)
```

这确实包含两种方法,一种是采用 `Integer` 类型参数的声明方法,另一种是采用 `Object` 类型参数的桥接方法。 (截至撰写本文时,`Sun JVM` 打印的是 `volatile` 而不是 `bridge`,因为`Java` 字节码中用于指示网桥方法的位也用于指示易失性字段;预计此错误将在未来版本中得到修复。)
这确实包含两种方法,一种是采用 `Integer` 类型参数的声明方法,另一种是采用 `Object` 类型参数的桥接方法。 (截至撰写本文时,`Sun JVM` 打印的是
`volatile` 而不是 `bridge`,因为`Java` 字节码中用于指示网桥方法的位也用于指示易失性字段;预计此错误将在未来版本中得到修复。)

将旧版代码转换为使用泛型时,网桥可以发挥重要作用; 见 `8.4` 节。






































《《《 [下一节](08_Covariant_Overriding.md) <br/>
《《《 [返回首页](../README.md)