[英]Cyclic inheritance when implementing inner interface in enum
我有以下实现会导致编译器错误:
public enum FusionStat implements MonsterStatBuilderHelper {
ATTACK {
@Override
public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
Objects.requireNonNull(baseMonsterCard);
Objects.requireNonNull(fusedMonsterCard);
Objects.requireNonNull(fusionCard);
if (baseMonsterCard.equals(fusedMonsterCard)) {
throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
}
return new MonsterCard.MonsterCardBuilder(baseMonsterCard)
.attack(baseMonsterCard.getAttack() + (fusionCard.getFusionPower() * fusedMonsterCard.getAttack()));
}
},
HITPOINTS {
@Override
public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
Objects.requireNonNull(baseMonsterCard);
Objects.requireNonNull(fusedMonsterCard);
Objects.requireNonNull(fusionCard);
if (baseMonsterCard.equals(fusedMonsterCard)) {
throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
}
return new MonsterCard.MonsterCardBuilder(baseMonsterCard)
.maximumHitpoints((int)(baseMonsterCard.getMaximumHitpoints() + (fusionCard.getFusionPower() / 100d * fusedMonsterCard.getMaximumHitpoints())))
.hitpoints((int)(baseMonsterCard.getHitpoints() + (fusionCard.getFusionPower() / 100d * fusedMonsterCard.getHitpoints())));
}
};
protected interface MonsterStatBuilderHelper extends MonsterStatBuilder {
default MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
return createBuilder(baseMonsterCard, fusedMonsterCard, fusionCard);
}
}
}
@FunctionalInterface
interface MonsterStatBuilder {
MonsterCard.MonsterCardBuilder createBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard);
}
它在involving FusionStat
的第一行给出了一个循环继承错误。
我不完全明白发生了什么。 我首先实现了一个抽象类,并希望让枚举扩展它,直到我意识到枚举不能扩展类。 现在我尝试(ab)使用 Java 8 中的默认方法。
我对关于为什么我的代码无法编译的思考过程很感兴趣,我试图通过在safeCreateBuilder
提取重复的代码来删除代码重复(仍然必须这样做)。
这是因为您正在从该类继承的类内部实现(编码)您正在实现(继承)的接口。
我希望我能把这句话做得更好......
但这是一个直观的例子。
Class A implements Interface B {
Interface B {
}
}
据我所知,这是不允许的。 您需要在类之外定义接口(在本例中为 Enum)。
像这样:
Interface B {
}
Class A implements Interface B {
}
最佳实践可能是将它们分成不同的文件。
你可以在这里看到你的代码有什么错误?
public enum FusionStat implements MonsterStatBuilderHelper {
protected interface MonsterStatBuilderHelper extends MonsterStatBuilder {
}
}
首先,您正在为FusionStat
枚举再次实现MonsterStatBuilderHelper
,在使用同名接口MonsterStatBuilderHelper
再次编写的enum
,您已经为顶级enum
实现了该接口,这就是为什么会出现循环继承错误的原因。
你可以在下面看到一些循环继承的例子
//1st example
class Person extends Person {} //this is not possible in real world, a Person itself child and parent both ?
//2nd example
class Human extends Person{}
class Person extends Human{}
注意:java 不支持循环继承,因为从逻辑上讲这是不可能的。
FusionStat
被定义为实现MonsterStatBuilderHelper
,但在这个枚举中,您尝试声明接口MonsterStatBuilderHelper
,它扩展了MonsterStatBuilder
。
我怀疑您想要做的只是在枚举中定义方法createBuilder()
。
如果您确实想定义MonsterStatBuilderHelper
接口,则需要在类/枚举之外完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.