//總超能力接口
interface SuperPower{}
//X射線超能力
interface XRayVision extends SuperPower{
void seeThroughWalls();
}
//聽力超能力
interface SuperHearing extends SuperPower{
void hearSubtieNoises();
}
//嗅覺超能力
interface SuperSmell extends SuperPower{
void trackBySmell();
}
//超人類(超人會包含一種超能力),在這個地方定義成泛型擦除上邊界爲SuperPower
class SuperHero<POWER extends SuperPower>{
POWER power;
SuperHero(POWER power){this.power = power; }
POWER get(){return power;}
}
//超級偵探繼承了超人類,擁有一種X射線的超能力(擦除上邊界爲x射線)
class SuperSleuth<POWER extends XRayVision> extends SuperHero<POWER>{
public SuperSleuth(POWER power) {super(power);}
void see(){power.seeThroughWalls();}
}
//犬女 擴張擦除上邊界爲 SuperSmellm,SuperHearing
class CanineHer<POWER extends SuperSmell & SuperHearing> extends SuperHero<POWER>{
public CanineHer(POWER power) {super(power);}
void hear(){power.hearSubtieNoises();}
}
//SuperHearing,SuperSmell的實現類
class SuperHearSmell implements SuperHearing,SuperSmell{
@Override
public void hearSubtieNoises() {}
@Override
public void trackBySmell() {}
}
//實現所有
class SuperAll extends SuperHearSmell implements XRayVision{
@Override
public void seeThroughWalls() {}
}
//犬男 實現同樣的效果(擦除至SuperSmellm,SuperHearing,XRayVision)
class DogBoy<POWER extends SuperAll> extends CanineHer<POWER> {
public DogBoy(POWER power) {super(power);}
public void demo(){
power.seeThroughWalls();
}
}
public class EpicBattle {
//這裏有點類似於向上轉型,這是安全的
static <POWER extends SuperHearing> void useSuperHearing(SuperHero<POWER> hero){
hero.get().hearSubtieNoises();
}
static <POWER extends SuperHearSmell> void superFind(SuperHero<POWER> hero){
hero.get().trackBySmell();
hero.get().trackBySmell();
}
public static void main(String[] args) {
DogBoy<SuperAll> d = new DogBoy<>(new SuperAll());
useSuperHearing(d);
superFind(d);
}
}
在泛型的繼承體系中,泛型的擦除邊界時可以被擴展的,不過是隻能擴展,不能強行改變,上下邊界時對擦除的一種補償