15.8 泛型擦除

//總超能力接口
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);
    }
}

在泛型的繼承體系中,泛型的擦除邊界時可以被擴展的,不過是隻能擴展,不能強行改變,上下邊界時對擦除的一種補償


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章