|
| 1 | +《《《 [返回首页](../README.md) <br/> |
| 2 | +《《《 [上一节](01_Legacy_Library_with_Legacy_Client.md) |
| 3 | + |
1 | 4 | ## 具有通用客户端的通用库
|
2 | 5 |
|
3 |
| -接下来,我们更新库和客户端以使用泛型,如例 `5-2` 中所示。 这是用于 `Java 5` 及其集合版框架的通用代码。 接口现在接受一个类型参数,变成 `Stack<E>`(类似于 `List<E>`),实现类也变为 `ArrayStack<E>`(类似于 `ArrayList<E>`),但没有添加类型参数 实用工具类 `Stacks`(类似于 `Collections`)。 `push` 和 `pop` 的签名和主体中的 `Object` 类型由类型参数 `E` 替换。 请注意,`ArrayStack` 中的构造函数不需要类型参数。 在实用程序类中,反向方法变为带有参数和 `Stack<T>` 类型结果的泛型方法。 适当的类型参数被添加到客户端,现在隐式装箱和取消装箱。 |
| 6 | +接下来,我们更新库和客户端以使用泛型,如例 `5-2` 中所示。 这是用于 `Java 5` 及其集合版框架的通用代码。 接口现在接受一个类型参数,变成 |
| 7 | +`Stack<E>`(类似于 `List<E>`),实现类也变为 `ArrayStack<E>`(类似于 `ArrayList<E>`),但没有添加类型参数 实用工具类 `Stacks`(类似于 |
| 8 | +`Collections`)。 `push` 和 `pop` 的签名和主体中的 `Object` 类型由类型参数 `E` 替换。 请注意,`ArrayStack` 中的构造函数不需要类型参数。 在实用程 |
| 9 | +序类中,反向方法变为带有参数和 `Stack<T>` 类型结果的泛型方法。 适当的类型参数被添加到客户端,现在隐式装箱和取消装箱。 |
4 | 10 |
|
5 |
| -简而言之,转换过程非常简单:只需添加一些类型参数,并用适当的类型变量替换 `Object` 的出现即可。 通过比较两个示例中突出显示的部分,可以发现传统版本和通用版本之间的所有差异。 泛型的实现设计为使两个版本生成基本上相同的类文件。 有些类型的辅助信息可能会有所不同,但要执行的实际字节码将是相同的。 因此,执行遗留版本和通用版本会产生相同的结果。 正如我们接下来讨论的那样,传统和普通资源产生相同类文件的事实可以简化进化过程。 |
| 11 | +简而言之,转换过程非常简单:只需添加一些类型参数,并用适当的类型变量替换 `Object` 的出现即可。 通过比较两个示例中突出显示的部分,可以发现传统版本和 |
| 12 | +通用版本之间的所有差异。 泛型的实现设计为使两个版本生成基本上相同的类文件。 有些类型的辅助信息可能会有所不同,但要执行的实际字节码将是相同的。 因此, |
| 13 | +执行遗留版本和通用版本会产生相同的结果。 正如我们接下来讨论的那样,传统和普通资源产生相同类文件的事实可以简化进化过程。 |
6 | 14 |
|
7 | 15 | 例 `5-1`。 传统客户端的旧版库
|
8 | 16 |
|
9 | 17 | ```java
|
10 | 18 | l/Stack.java:
|
11 |
| - interface Stack { |
12 |
| - public boolean empty(); |
13 |
| - public void push(Object elt); |
14 |
| - public Object pop(); |
15 |
| - } |
| 19 | + interface Stack { |
| 20 | + public boolean empty(); |
| 21 | + public void push(Object elt); |
| 22 | + public Object pop(); |
| 23 | + } |
16 | 24 | l/ArrayStack.java:
|
17 |
| - import java.util.*; |
18 |
| - class ArrayStack implements Stack { |
19 |
| - private List list; |
20 |
| - public ArrayStack() { list = new ArrayList(); } |
21 |
| - public boolean empty() { return list.size() == 0; } |
22 |
| - public void push(Object elt) { list.add(elt); } |
23 |
| - public Object pop() { |
24 |
| - Object elt = list.remove(list.size()-1); |
25 |
| - return elt; |
26 |
| - } |
27 |
| - public String toString() { return "stack"+list.toString(); } |
28 |
| - } |
| 25 | + import java.util.*; |
| 26 | + class ArrayStack implements Stack { |
| 27 | + private List list; |
| 28 | + public ArrayStack() { list = new ArrayList(); } |
| 29 | + public boolean empty() { return list.size() == 0; } |
| 30 | + public void push(Object elt) { list.add(elt); } |
| 31 | + public Object pop() { |
| 32 | + Object elt = list.remove(list.size()-1); |
| 33 | + return elt; |
| 34 | + } |
| 35 | + public String toString() { return "stack"+list.toString(); } |
| 36 | + } |
29 | 37 | l/Stacks.java:
|
30 |
| - class Stacks { |
31 |
| - public static Stack reverse(Stack in) { |
32 |
| - Stack out = new ArrayStack(); |
33 |
| - while (!in.empty()) { |
34 |
| - Object elt = in.pop(); |
35 |
| - out.push(elt); |
36 |
| - } |
37 |
| - return out; |
38 |
| - } |
39 |
| - } |
40 |
| - l/Client.java: |
| 38 | + class Stacks { |
| 39 | + public static Stack reverse(Stack in) { |
| 40 | + Stack out = new ArrayStack(); |
| 41 | + while (!in.empty()) { |
| 42 | + Object elt = in.pop(); |
| 43 | + out.push(elt); |
| 44 | + } |
| 45 | + return out; |
| 46 | + } |
| 47 | + } |
| 48 | + l/Client.java: |
41 | 49 | class Client {
|
42 | 50 | public static void main(String[] args) {
|
43 | 51 | Stack stack = new ArrayStack();
|
|
52 | 60 | }
|
53 | 61 | ```
|
54 | 62 |
|
| 63 | +《《《 [下一节](03_Generic_Library_with_Legacy_Client.md) <br/> |
| 64 | +《《《 [返回首页](../README.md) |
0 commit comments