Skip to content

Commit b475901

Browse files
authored
Update 02_Generic_Library_with_Generic_Client.md
1 parent 4ce5a2e commit b475901

File tree

1 file changed

+40
-30
lines changed

1 file changed

+40
-30
lines changed

Diff for: ch05/02_Generic_Library_with_Generic_Client.md

+40-30
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,51 @@
1+
《《《 [返回首页](../README.md) <br/>
2+
《《《 [上一节](01_Legacy_Library_with_Legacy_Client.md)
3+
14
## 具有通用客户端的通用库
25

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>` 类型结果的泛型方法。 适当的类型参数被添加到客户端,现在隐式装箱和取消装箱。
410

5-
简而言之,转换过程非常简单:只需添加一些类型参数,并用适当的类型变量替换 `Object` 的出现即可。 通过比较两个示例中突出显示的部分,可以发现传统版本和通用版本之间的所有差异。 泛型的实现设计为使两个版本生成基本上相同的类文件。 有些类型的辅助信息可能会有所不同,但要执行的实际字节码将是相同的。 因此,执行遗留版本和通用版本会产生相同的结果。 正如我们接下来讨论的那样,传统和普通资源产生相同类文件的事实可以简化进化过程。
11+
简而言之,转换过程非常简单:只需添加一些类型参数,并用适当的类型变量替换 `Object` 的出现即可。 通过比较两个示例中突出显示的部分,可以发现传统版本和
12+
通用版本之间的所有差异。 泛型的实现设计为使两个版本生成基本上相同的类文件。 有些类型的辅助信息可能会有所不同,但要执行的实际字节码将是相同的。 因此,
13+
执行遗留版本和通用版本会产生相同的结果。 正如我们接下来讨论的那样,传统和普通资源产生相同类文件的事实可以简化进化过程。
614

715
`5-1`。 传统客户端的旧版库
816

917
```java
1018
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+
}
1624
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+
}
2937
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:
4149
class Client {
4250
public static void main(String[] args) {
4351
Stack stack = new ArrayStack();
@@ -52,3 +60,5 @@
5260
}
5361
```
5462

63+
《《《 [下一节](03_Generic_Library_with_Legacy_Client.md) <br/>
64+
《《《 [返回首页](../README.md)

0 commit comments

Comments
 (0)