Cyclic inheritance when implementing inner interface in enum
我有下面的实现,它给出了一个编译器错误:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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); } |
它在第一行
我不知道到底发生了什么。我首先实现了一个抽象类,并希望让枚举扩展它,直到我意识到枚举不能扩展类为止。现在我尝试(ab)使用Java 8中的默认方法。
我对我的代码为什么不编译的思考过程很感兴趣,我试图通过在
这是因为您正在实现(编码)您正在从该类继承的类内部实现(继承)的接口。
我希望我能把那句话写得更好…
但这里有一个可视的例子。
1 2 3 4 5 | Class A implements Interface B { Interface B { } } |
据我所知,这是不允许的。您需要在类外部定义接口(在本例中是枚举)。
像这样:
1 2 3 4 5 | Interface B { } Class A implements Interface B { } |
最佳实践可能是将它们分成不同的文件。
我怀疑您要做的只是在枚举中定义方法
如果您确实想要定义