|
3 | 3 | // We make no guarantees that this code is fit for any purpose. |
4 | 4 | // Visit http://OnJava8.com for more book information. |
5 | 5 | // Bounds in Java generics |
| 6 | + |
6 | 7 | import java.util.*; |
7 | 8 |
|
8 | | -interface SuperPower {} |
| 9 | +interface SuperPower { |
| 10 | +} |
9 | 11 |
|
10 | 12 | interface XRayVision extends SuperPower { |
11 | | - void seeThroughWalls(); |
| 13 | + void seeThroughWalls(); |
12 | 14 | } |
13 | 15 |
|
14 | 16 | interface SuperHearing extends SuperPower { |
15 | | - void hearSubtleNoises(); |
| 17 | + void hearSubtleNoises(); |
16 | 18 | } |
17 | 19 |
|
18 | 20 | interface SuperSmell extends SuperPower { |
19 | | - void trackBySmell(); |
| 21 | + void trackBySmell(); |
20 | 22 | } |
21 | 23 |
|
22 | 24 | class SuperHero<POWER extends SuperPower> { |
23 | | - POWER power; |
24 | | - SuperHero(POWER power) { this.power = power; } |
25 | | - POWER getPower() { return power; } |
| 25 | + POWER power; |
| 26 | + |
| 27 | + SuperHero(POWER power) { |
| 28 | + this.power = power; |
| 29 | + } |
| 30 | + |
| 31 | + POWER getPower() { |
| 32 | + return power; |
| 33 | + } |
26 | 34 | } |
27 | 35 |
|
28 | | -class SuperSleuth<POWER extends XRayVision> |
29 | | -extends SuperHero<POWER> { |
30 | | - SuperSleuth(POWER power) { super(power); } |
31 | | - void see() { power.seeThroughWalls(); } |
| 36 | +class SuperSleuth<POWER extends XRayVision> extends SuperHero<POWER> { |
| 37 | + SuperSleuth(POWER power) { |
| 38 | + super(power); |
| 39 | + } |
| 40 | + |
| 41 | + void see() { |
| 42 | + power.seeThroughWalls(); |
| 43 | + } |
32 | 44 | } |
33 | 45 |
|
34 | 46 | class |
35 | | -CanineHero<POWER extends SuperHearing & SuperSmell> |
36 | | -extends SuperHero<POWER> { |
37 | | - CanineHero(POWER power) { super(power); } |
38 | | - void hear() { power.hearSubtleNoises(); } |
39 | | - void smell() { power.trackBySmell(); } |
| 47 | +CanineHero<POWER extends SuperHearing & SuperSmell> extends SuperHero<POWER> { |
| 48 | + CanineHero(POWER power) { |
| 49 | + super(power); |
| 50 | + } |
| 51 | + |
| 52 | + void hear() { |
| 53 | + power.hearSubtleNoises(); |
| 54 | + } |
| 55 | + |
| 56 | + void smell() { |
| 57 | + power.trackBySmell(); |
| 58 | + } |
40 | 59 | } |
41 | 60 |
|
42 | | -class SuperHearSmell |
43 | | -implements SuperHearing, SuperSmell { |
44 | | - @Override |
45 | | - public void hearSubtleNoises() {} |
46 | | - @Override |
47 | | - public void trackBySmell() {} |
| 61 | +class SuperHearSmell implements SuperHearing, SuperSmell { |
| 62 | + @Override |
| 63 | + public void hearSubtleNoises() { |
| 64 | + } |
| 65 | + |
| 66 | + @Override |
| 67 | + public void trackBySmell() { |
| 68 | + } |
48 | 69 | } |
49 | 70 |
|
50 | 71 | class DogPerson extends CanineHero<SuperHearSmell> { |
51 | | - DogPerson() { super(new SuperHearSmell()); } |
| 72 | + DogPerson() { |
| 73 | + super(new SuperHearSmell()); |
| 74 | + } |
52 | 75 | } |
53 | 76 |
|
54 | 77 | public class EpicBattle { |
55 | | - // Bounds in generic methods: |
56 | | - static <POWER extends SuperHearing> |
57 | | - void useSuperHearing(SuperHero<POWER> hero) { |
58 | | - hero.getPower().hearSubtleNoises(); |
59 | | - } |
60 | | - static <POWER extends SuperHearing & SuperSmell> |
61 | | - void superFind(SuperHero<POWER> hero) { |
62 | | - hero.getPower().hearSubtleNoises(); |
63 | | - hero.getPower().trackBySmell(); |
64 | | - } |
65 | | - public static void main(String[] args) { |
66 | | - DogPerson dogPerson = new DogPerson(); |
67 | | - useSuperHearing(dogPerson); |
68 | | - superFind(dogPerson); |
69 | | - // You can do this: |
70 | | - List<? extends SuperHearing> audioPeople; |
71 | | - // But you can't do this: |
72 | | - // List<? extends SuperHearing & SuperSmell> dogPs; |
73 | | - } |
| 78 | + // Bounds in generic methods: |
| 79 | + static <POWER extends SuperHearing> |
| 80 | + void useSuperHearing(SuperHero<POWER> hero) { |
| 81 | + hero.getPower().hearSubtleNoises(); |
| 82 | + } |
| 83 | + |
| 84 | + static <POWER extends SuperHearing & SuperSmell> |
| 85 | + void superFind(SuperHero<POWER> hero) { |
| 86 | + hero.getPower().hearSubtleNoises(); |
| 87 | + hero.getPower().trackBySmell(); |
| 88 | + } |
| 89 | + |
| 90 | + public static void main(String[] args) { |
| 91 | + DogPerson dogPerson = new DogPerson(); |
| 92 | + useSuperHearing(dogPerson); |
| 93 | + superFind(dogPerson); |
| 94 | + // You can do this: |
| 95 | + List<? extends SuperHearing> audioPeople; |
| 96 | + // But you can't do this: |
| 97 | +// List<? extends SuperHearing & SuperSmell> dogPs; |
| 98 | + } |
74 | 99 | } |
0 commit comments