//总超能力接口
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);
}
}
在泛型的继承体系中,泛型的擦除边界时可以被扩展的,不过是只能扩展,不能强行改变,上下边界时对擦除的一种补偿