-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExample130.java
More file actions
118 lines (104 loc) · 3.88 KB
/
Example130.java
File metadata and controls
118 lines (104 loc) · 3.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// Example 130 from page 99
//
class Vehicle { }
class Car extends Vehicle { }
class Sedan extends Car { }
class Shop<T> {
private T thing;
public T buyFrom() {
return thing;
}
public void sellTo(T thing) {
this.thing = thing;
}
}
class Example130 {
@SuppressWarnings("unchecked") // The five b0.sellTo(...) calls
public static void main(String[] args) {
Object object = new Object();
Vehicle vehicle = new Vehicle();
Car car = new Car();
Sedan sedan = new Sedan();
Shop b0;
b0 = new Shop<Object>();
b0 = new Shop<Vehicle>();
b0 = new Shop<Car>();
b0 = new Shop<Sedan>();
Object o0 = b0.buyFrom();
// Vehicle v4 = b0.buyFrom(); // Illegal
// Car c4 = b0.buyFrom(); // Illegal
// Sedan s4 = b0.buyFrom(); // Illegal
b0.sellTo(object); // Legal, but run-time unchecked
b0.sellTo(vehicle); // Legal, but run-time unchecked
b0.sellTo(car); // Legal, but run-time unchecked
b0.sellTo(sedan); // Legal, but run-time unchecked
b0.sellTo(b0.buyFrom()); // Legal, but run-time unchecked
Shop<Car> b1;
// b1 = new Shop<Object>(); // Illegal
// b1 = new Shop<Vehicle>(); // Illegal
b1 = new Shop<Car>();
// b1 = new Shop<Sedan>(); // Illegal
Object o1 = b1.buyFrom();
Vehicle v1 = b1.buyFrom();
Car c1 = b1.buyFrom();
// Sedan s1 = b1.buyFrom(); // Illegal
// b1.sellTo(object); // Illegal
// b1.sellTo(vehicle); // Illegal
b1.sellTo(car);
b1.sellTo(sedan);
b1.sellTo(b1.buyFrom());
Shop<?> b2;
b2 = new Shop<Object>();
b2 = new Shop<Vehicle>();
b2 = new Shop<Car>();
b2 = new Shop<Sedan>();
Object o2 = b2.buyFrom();
// Vehicle v2 = b2.buyFrom(); // Illegal
// Car c2 = b2.buyFrom(); // Illegal
// Sedan s2 = b2.buyFrom(); // Illegal
// b2.sellTo(object); // Illegal
// b2.sellTo(vehicle); // Illegal
// b2.sellTo(car); // Illegal
// b2.sellTo(sedan); // Illegal
// b2.sellTo(b2.buyFrom()); // Illegal
Shop<? extends Car> b3;
// b3 = new Shop<Object>(); // Illegal
// b3 = new Shop<Vehicle>(); // Illegal
b3 = new Shop<Car>();
b3 = new Shop<Sedan>();
Object o3 = b3.buyFrom();
Vehicle v3 = b3.buyFrom();
Car c3 = b3.buyFrom();
// Sedan s3 = b3.buyFrom(); // Illegal
// b3.sellTo(object); // Illegal
// b3.sellTo(vehicle); // Illegal
// b3.sellTo(car); // Illegal
// b3.sellTo(sedan); // Illegal
// b3.sellTo(b3.buyFrom()); // Illegal
Shop<? super Car> b4;
b4 = new Shop<Object>();
b4 = new Shop<Vehicle>();
b4 = new Shop<Car>();
// b4 = new Shop<Sedan>(); // Illegal
Object o4 = b4.buyFrom();
// Vehicle v4 = b4.buyFrom(); // Illegal
// Car c4 = b4.buyFrom(); // Illegal
// Sedan s4 = b4.buyFrom(); // Illegal
// b4.sellTo(object); // Illegal
// b4.sellTo(vehicle); // Illegal
b4.sellTo(car);
b4.sellTo(sedan);
// b4.sellTo(b4.buyFrom()); // Illegal
// Shop<Object> b5 = new Shop<Car>(); // Illegal
Shop<Object> b5 = new Shop<Object>();
Object o5 = b5.buyFrom();
// Vehicle v4 = b5.buyFrom(); // Illegal
// Car c4 = b5.buyFrom(); // Illegal
// Sedan s4 = b5.buyFrom(); // Illegal
b5.sellTo(object);
b5.sellTo(vehicle);
b5.sellTo(car);
b5.sellTo(sedan);
b5.sellTo(b5.buyFrom());
}
}