在枚举中实现内部接口时循环继承 [英] Cyclic inheritance when implementing inner interface in enum
问题描述
public enum FusionStat实现MonsterStatBuilderHelper {
ATTACK {
@Override
public MonsterCard.MonsterCardBuilder safeCreateBuilder(最终的MonsterCard baseMonsterCard,最终的MonsterCard fusionMonsterCard,最终的FusionCard fusionCard){
Objects.requireNonNull(baseMonsterCard);
Objects.requireNonNull(fusedMonsterCard);
Objects.requireNonNull(fusionCard);
if(baseMonsterCard.equals(fusedMonsterCard)){
throw new IllegalArgumentException(baseMonsterCard and fusedMonsterCard需要不同);
}
返回新的MonsterCard.MonsterCardBuilder(baseMonsterCard)
.attack(baseMonsterCard.getAttack()+(fusionCard.getFusionPower()* fusedMonsterCard.getAttack()));
}
},
HITPOINTS {
@Override
public MonsterCard.MonsterCardBuilder safeCreateBuilder(最终的MonsterCard baseMonsterCard,最终的MonsterCard fusionMonsterCard,最终的FusionCard fusionCard){
Objects.requireNonNull(baseMonsterCard);
Objects.requireNonNull(fusedMonsterCard);
Objects.requireNonNull(fusionCard);
if(baseMonsterCard.equals(fusedMonsterCard)){
throw new IllegalArgumentException(baseMonsterCard and fusedMonsterCard需要不同);
}
返回新的MonsterCard.MonsterCardBuilder(baseMonsterCard)
.maximumHitpoints((int)(baseMonsterCard.getMaximumHitpoints()+(fusionCard.getFusionPower()/ 100d * fusedMonsterCard.getMaximumHitpoints())) )
.hitpoints((int)(baseMonsterCard.getHitpoints()+(fusionCard.getFusionPower()/ 100d * fusedMonsterCard.getHitpoints())));
}
};
保护接口MonsterStatBuilderHelper扩展MonsterStatBuilder {
默认MonsterCard.MonsterCardBuilder safeCreateBuilder(最终的MonsterCard baseMonsterCard,最终的MonsterCard fusionMonsterCard,最终的FusionCard fusionCard){
return createBuilder(baseMonsterCard,fusedMonsterCard,fusionCard) ;
$
$ b @FunctionalInterface
界面MonsterStatBuilder {
MonsterCard.MonsterCardBuilder createBuilder(Final MonsterCard baseMonsterCard,Final MonsterCard fusionMonsterCard,final FusionCard fusionCard);
}
它在第一行上给出循环继承错误涉及到FusionStat
。
我不太清楚发生了什么。我首先实现了一个抽象类,并希望让枚举扩展,直到我意识到枚举不能扩展类。现在我尝试(ab)使用Java 8中的默认方法。
我对思想过程感兴趣,为什么我的代码不能编译,我试图删除代码重复(仍然要这样做),通过在 safeCreateBuilder
中拉出重复的代码。
这是因为您正在实现(编码)您正在从该类继承的类中实现(继承)的接口。
我希望我能使这句话更好...
但这里是一个视觉示例。
A类实现接口B {
接口B {
}
}
据我所知,这是不允许的。你需要定义界面以外的类(在这种情况下是枚举)。
像这样:
接口B {
/ pre>
}
A类实现接口B {
}
最佳做法可能是将它们分解成不同的文件。
I have the following implementation that gives a compiler error:
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); }
It gives a cyclic inheritance error on the first line
involving FusionStat
.I don't exactly see what is going on. I had first implemented an abstract class and wanted to let the enum extend that, until I realized that enums cannot extend classes. Now I try to (ab)use the default methods in Java 8.
I am interested in the thought process about why my code does not compile, I was trying to remove code duplication (still have to do so), by pulling the duplicated code inside
safeCreateBuilder
.解决方案This would be because you are implementing (coding) the interface you are implementing (inheriting) inside of the class that is inheriting from that class.
I wish I could make that sentence better...
But here is a visual example.
Class A implements Interface B { Interface B { } }
As far as I know, this is not allowed. You need to define the interface outside of the class (in this case, an Enum).
Like so:
Interface B { } Class A implements Interface B { }
Best practice is probably to break them up into different files.
这篇关于在枚举中实现内部接口时循环继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!