在枚举中实现内部接口时的循环inheritance
我有以下实现,给出了一个编译器错误:
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
的第一行上给出循环inheritance错误。
我不完全知道发生了什么事。 我首先实现了一个抽象类,并想让枚举扩展,直到我意识到枚举不能扩展类。 现在我尝试(ab)使用Java 8中的默认方法。
我对为什么我的代码不能编译的思考过程感兴趣,我试图通过在safeCreateBuilder
内部复制代码来删除代码重复(仍然需要这样做)。
这是因为您正在实现(编码)正在从该类inheritance的类内部实现(inheritance)的接口。
我希望能让这句话更好。
但这是一个视觉例子。
Class A implements Interface B { Interface B { } }
据我所知,这是不允许的。 你需要定义类之外的接口(在本例中是Enum)。
像这样:
Interface B { } Class A implements Interface B { }
最佳实践可能是把它们分解成不同的文件。
FusionStat
被定义为实现MonsterStatBuilderHelper
,但是在这个枚举中,你试图声明MonsterStatBuilderHelper
接口来扩展MonsterStatBuilder
。
我怀疑你想要做的只是在你的枚举中定义方法createBuilder()
。
如果你真的想要定义MonsterStatBuilderHelper
接口,这需要在class / enum之外完成。