在枚举中实现内部接口时的循环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之外完成。