Skip to content

Commit 6e0f839

Browse files
committed
添加上下文链接
1 parent 37a687a commit 6e0f839

5 files changed

+27
-5
lines changed

ch08/00_Effective_Generics.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](../ch07/06_Reflecting_Generic_Types.md)
3+
14
## 有效的泛型
25

3-
本章包含如何在实际编码中有效使用泛型的建议。 我们考虑检查集合,安全问题,专用类和二进制兼容性。 本节的标题是对 `Joshua Bloch` 的着作 `Effective Java(Addison-Wesley)`的致敬。
6+
本章包含如何在实际编码中有效使用泛型的建议。 我们考虑检查集合,安全问题,专用类和二进制兼容性。 本节的标题是对 `Joshua Bloch` 的着作 `Effective Java(Addison-Wesley)` 的致敬。
7+
8+
《《《 [下一节](01_Take_Care_when_Callin_Legacy_Code.md) <br/>
9+
《《《 [返回首页](../README.md)

ch08/01_Take_Care_when_Callin_Legacy_Code.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](00_Effective_Generics.md)
3+
14
## 调用遗留代码时要小心
25

36
正如我们所看到的,泛型类型在编译时被检查,而不是运行时。 通常,这正是我们想要的,因为在编译时检查会更早地报告错误,并且不会导致运行时开销。 但是,有时这可能不合适,因为我们无法确定编译时检查是否足够(比如说,因为我们将参数化类型的实例传递给旧客户端或我们不信任的客户端 ),还是因为我们在运行时需要关于类型的信息(比如说,因为我们需要一个可重用类型作为数组组件)。 一个托收集合通常会诀窍,如果不行,我们可以创建一个专门的类。 我们考虑本节中的已检查集合,下一节中的安全问题以及之后的部分中的专门类。
@@ -59,7 +62,8 @@
5962

6063
仅当列表元素具有可确定类型时,检查列表才提供有用的保证。 如果你想在列表不是可确定类型时应用这些技术,你可能需要考虑应用 `8.3` 节的专门化技术。
6164

62-
65+
《《《 [下一节](02_Use_Checked_Collections_to_Enforce_Security.md) <br/>
66+
《《《 [返回首页](../README.md)
6367

6468

6569

ch08/02_Use_Checked_Collections_to_Enforce_Security.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](01_Take_Care_when_Callin_Legacy_Code.md)
3+
14
## 使用选中的集合来强化安全性
25

36
请注意,通用类型提供的保证仅适用于没有未经检查的警告的情况。 这意味着泛型类型对于确保其他人编写的代码的安全性没有用处,因为您无法知道该代码是否在编译时引发未经检查的警告。
@@ -65,7 +68,8 @@
6568

6669
选中的集合不是实施安全性的唯一技术。 如果提供订单的接口返回一个列表而不是接受一个列表,那么代理可以使用前一节中的空循环技术来确保列表只包含经过授权的订单,然后才能通过它们。 也可以使用专业化,如下一节所述,创建一个特殊类型的列表,只能包含授权订单。
6770

68-
71+
《《《 [下一节](03_Specialize_to_Create_Reifiable_Types.md) <br/>
72+
《《《 [返回首页](../README.md)
6973

7074

7175

ch08/03_Specialize_to_Create_Reifiable_Types.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](02_Use_Checked_Collections_to_Enforce_Security.md)
3+
14
## 专注于创建可维持类型
25

36
参数化类型不可确定,但某些操作(如实例测试,转换和数组创建仅适用于可重用类型)。 在这种情况下,一种解决方法是创建参数化类型的专用版本。 专业版本可以通过委托(即包装)或继承(即子类化)来创建,我们依次讨论每个版本。
@@ -164,7 +167,8 @@
164167

165168
这有两个问题:第一个接口使用相同的擦除扩展了两个不同的接口,这是不允许的(见 `4.4` 节),而第二个接口的顶级使用通配符的超类型,这也是不允许的 见 `2.8` 节)。 唯一的解决方法是避免包含通配符的类型的专业化; 幸运的是,这应该很少成为问题。
166169

167-
170+
《《《 [下一节](04_Maintain_Binary_Compatibility.md) <br/>
171+
《《《 [返回首页](../README.md)
168172

169173

170174

ch08/04_Maintain_Binary_Compatibility.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](03_Specialize_to_Create_Reifiable_Types.md)
3+
14
## 保持二进制兼容性
25

36
正如我们强调的那样,泛型是通过擦除来实现的,以缓解进化。当将遗留代码转化为泛型代码时,我们希望确保新生代码能够与任何现有代码一起工作,包括我们没有源代码的类文件。当这种情况发生时,我们说传统和通用版本是二进制兼容的。
@@ -204,7 +207,8 @@
204207

205208
这保证与用户可能定义的任何子类兼容。 同样,如果你还可以生成任何子类,或者如果这个类是最终的,那么你有更多的自由。
206209

207-
210+
《《《 [下一节](../ch09/00_Design_Patterns.md) <br/>
211+
《《《 [返回首页](../README.md)
208212

209213

210214

0 commit comments

Comments
 (0)