|
| 1 | +《《《 [返回首页](../README.md) <br/> |
| 2 | +《《《 [上一节](02_Generic_Library_with_Generic_Client.md) |
| 3 | + |
1 | 4 | ## 具有传统客户端的通用库
|
2 | 5 |
|
3 | 6 | 现在让我们考虑一下这种情况,即在客户端保留其旧版本时,库更新为泛型。这可能是因为没有足够的时间一次转换所有内容,或者因为类库和客户由不同的组织控制。
|
|
28 | 31 |
|
29 | 32 | ```java
|
30 | 33 | g/Stack.java:
|
31 |
| - interface Stack<E> { |
32 |
| - public boolean empty(); |
33 |
| - public void push(E elt); |
34 |
| - public E pop(); |
35 |
| - } |
| 34 | + interface Stack<E> { |
| 35 | + public boolean empty(); |
| 36 | + public void push(E elt); |
| 37 | + public E pop(); |
| 38 | + } |
36 | 39 |
|
37 | 40 | g/ArrayStack.java:
|
38 |
| - import java.util.*; |
39 |
| - class ArrayStack<E> implements Stack<E> { |
| 41 | + import java.util.*; |
| 42 | + class ArrayStack<E> implements Stack<E> { |
40 | 43 | private List<E> list;
|
41 | 44 | public ArrayStack() { list = new ArrayList<E>(); }
|
42 | 45 | public boolean empty() { return list.size() == 0; }
|
|
48 | 51 | public String toString() { return "stack"+list.toString(); }
|
49 | 52 | }
|
50 | 53 |
|
51 |
| - g/Stacks.java: |
| 54 | + g/Stacks.java: |
52 | 55 | class Stacks {
|
53 | 56 | public static <T> Stack<T> reverse(Stack<T> in) {
|
54 | 57 | Stack<T> out = new ArrayStack<T>();
|
|
60 | 63 | }
|
61 | 64 | }
|
62 | 65 |
|
63 |
| - g/Client.java: |
64 |
| - class Client { |
65 |
| - public static void main(String[] args) { |
66 |
| - Stack<Integer> stack = new ArrayStack<Integer>(); |
67 |
| - for (int i = 0; i<4; i++) stack.push(i); |
68 |
| - assert stack.toString().equals("stack[0, 1, 2, 3]"); |
69 |
| - int top = stack.pop(); |
70 |
| - assert top == 3 && stack.toString().equals("stack[0, 1, 2]"); |
71 |
| - Stack<Integer> reverse = Stacks.reverse(stack); |
72 |
| - assert stack.empty(); |
73 |
| - assert reverse.toString().equals("stack[2, 1, 0]"); |
74 |
| - } |
75 |
| - } |
| 66 | + g/Client.java: |
| 67 | + class Client { |
| 68 | + public static void main(String[] args) { |
| 69 | + Stack<Integer> stack = new ArrayStack<Integer>(); |
| 70 | + for (int i = 0; i<4; i++) stack.push(i); |
| 71 | + assert stack.toString().equals("stack[0, 1, 2, 3]"); |
| 72 | + int top = stack.pop(); |
| 73 | + assert top == 3 && stack.toString().equals("stack[0, 1, 2]"); |
| 74 | + Stack<Integer> reverse = Stacks.reverse(stack); |
| 75 | + assert stack.empty(); |
| 76 | + assert reverse.toString().equals("stack[2, 1, 0]"); |
| 77 | + } |
| 78 | + } |
76 | 79 | ```
|
77 | 80 |
|
78 | 81 | 如果我们遵循上面的建议,并在启用适当的开关的情况下重新运行编译器,我们会得到更多的细节:
|
|
130 | 133 | 这编译了遗留代码并且没有发出警告或错误。 这种关闭警告的方法只适用于真正的遗留代码,没有 `Java 5` 中引入的通用功能或其他功能。 也可以使用注释关闭未经
|
131 | 134 | 检查的警告,如下一节所述,即使使用 `Java 5` 中引入的功能,也可以使用这些警告。
|
132 | 135 |
|
| 136 | +《《《 [下一节](04_Legacy_Library_with_Generic_Client.md) <br/> |
| 137 | +《《《 [返回首页](../README.md) |
0 commit comments