在枚举中实现内部接口时的循环继承 [英] Cyclic inheritance when implementing inner interface in enum
问题描述
我有以下实现会导致编译器错误:
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);
}
它在第一行involving FusionStat
给出了一个循环继承错误.
It gives a cyclic inheritance error on the first line involving FusionStat
.
我不完全明白发生了什么.我首先实现了一个抽象类,并希望让枚举扩展它,直到我意识到枚举不能扩展类.现在我尝试 (ab) 使用 Java 8 中的默认方法.
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.
我对为什么我的代码无法编译的思考过程很感兴趣,我试图通过在 safeCreateBuilder
中提取重复的代码来删除代码重复(仍然必须这样做).>
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 {
}
}
据我所知,这是不允许的.您需要在类之外定义接口(在本例中为 Enum).
As far as I know, this is not allowed. You need to define the interface outside of the class (in this case, an Enum).
像这样:
Interface B {
}
Class A implements Interface B {
}
最佳做法可能是将它们分成不同的文件.
Best practice is probably to break them up into different files.
这篇关于在枚举中实现内部接口时的循环继承的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!