thinking in java看了差不多有5,6遍,但是之前有些章节看得不仔细。最近有感于自己技术的不扎实,开始重看thinking in java, 发现了书中的一个错误,在原书的491页。
1: //: generics/Wildcards.java
2: // Exploring the meaning of wildcards.
3:
4: public class Wildcards {
5: // Raw argument:
6: static void rawArgs(Holder holder, Object arg) {
7: // holder.set(arg); // Warning:
8: // Unchecked call to set(T) as a
9: // member of the raw type Holder
10: // holder.set(new Wildcards()); // Same warning
11:
12: // Can't do this; don't have any 'T':
13: // T t = holder.get();
14:
15: // OK, but type information has been lost:
16: Object obj = holder.get();
17: }
18: // Similar to rawArgs(), but errors instead of warnings:
19: static void unboundedArg(Holder< > holder, Object arg) {
20: // holder.set(arg); // Error:
21: // set(capture of ) in Holder
22: // cannot be applied to (Object)
23: // holder.set(new Wildcards()); // Same error
24:
25: // Can't do this; don't have any 'T':
26: // T t = holder.get();
27:
28: // OK, but type information has been lost:
29: Object obj = holder.get();
30: }
31: static
32: T t = holder.get();
33: return t;
34: }
35: static
36: holder.set(arg);
37: T t = holder.get();
38: return t;
39: }
40: static
41: T wildSubtype(Holder< extends T> holder, T arg) {
42: // holder.set(arg); // Error:
43: // set(capture of extends T) in
44: // Holder
45: // cannot be applied to (T)
46: T t = holder.get();
47: return t;
48: }
49: static
51: holder.set(arg);
52: // T t = holder.get(); // Error:
53: // Incompatible types: found Object, required T
54:
55: // OK, but type information has been lost:
56: Object obj = holder.get();
57: }
58: public static void main(String[] args) {
59: Holder raw = new Holder
60: // Or:
61: raw = new Holder();
62: Holder
63: Holder< > unbounded = new Holder
64: Holder< extends Long> bounded = new Holder
65: Long lng = 1L;
66:
67: rawArgs(raw, lng);
68: rawArgs(qualified, lng);
69: rawArgs(unbounded, lng);
70: rawArgs(bounded, lng);
71:
72: unboundedArg(raw, lng);
73: unboundedArg(qualified, lng);
74: unboundedArg(unbounded, lng);
75: unboundedArg(bounded, lng);
76:
77: // Object r1 = exact1(raw); // Warnings:
78: // Unchecked conversion from Holder to Holder
79: // Unchecked method invocation: exact1(Holder
80: // is applied to (Holder)
81: Long r2 = exact1(qualified);
82: Object r3 = exact1(unbounded); // Must return Object
83: Long r4 = exact1(bounded);
84:
85: // Long r5 = exact2(raw, lng); // Warnings:
86: // Unchecked conversion from Holder to Holder
87: // Unchecked method invocation: exact2(Holder
88: // is applied to (Holder,Long)
89: Long r6 = exact2(qualified, lng);
90: // Long r7 = exact2(unbounded, lng); // Error:
91: // exact2(Holder
92: // (Holder
93: // Long r8 = exact2(bounded, lng); // Error:
94: // exact2(Holder
95: // to (Holder
96:
97: // Long r9 = wildSubtype(raw, lng); // Warnings:
98: // Unchecked conversi