我有以下实现,它给出了编译器错误:
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
上给出了循环继承错误。
我不确切地知道发生了什么。我首先实现了一个抽象类,并希望让枚举扩展,直到我意识到枚举不能扩展类。现在我尝试(ab)使用Java 8中的默认方法。
我对我的代码无法编译的思考过程感兴趣,我试图删除代码重复(仍然必须这样做),通过在safeCreateBuilder
内拉出重复的代码。
答案 0 :(得分:118)
这是因为您正在实现(编码)您正在从该类继承的类中实现(继承)的接口。
我希望我能把这句话弄得更好......
但这是一个直观的例子。
Class A implements Interface B {
Interface B {
}
}
据我所知,这是不允许的。您需要在类之外定义接口(在本例中为Enum)。
像这样:
Interface B {
}
Class A implements Interface B {
}
最佳做法可能是将它们分解为不同的文件。
答案 1 :(得分:0)
您可以在此处查看代码中的错误吗?
@Bean
class MyFilter {
@Autowired
public MyFilter(MyService myService) {...}
public doFilter(request, response, chain) {
if (request. ...) {
throw new ResponseStatusException(HttpStatus.BAD_REQUEST)
// or return new MyErrorPojo()
}
return chain.doFilter(request, response)
}
}
首先,您要在public enum FusionStat implements MonsterStatBuilderHelper {
protected interface MonsterStatBuilderHelper extends MonsterStatBuilder {
}
}
内再次为MonsterStatBuilderHelper
枚举实现FusionStat
,并用相同的名称接口enum
再写一次,而您已经在顶层{ {1}},这就是为什么您遇到循环继承错误。
您可以在下面看到一些循环继承示例
MonsterStatBuilderHelper
注意:Java中不支持循环继承,因为从逻辑上讲不可能。
答案 2 :(得分:-4)
FusionStat
定义为实现MonsterStatBuilderHelper
,但在此枚举中,您尝试声明扩展MonsterStatBuilderHelper
的接口MonsterStatBuilder
。
我怀疑你想要做的只是在你的枚举中定义方法createBuilder()
。
如果您确实想要定义MonsterStatBuilderHelper
接口,则需要在class / enum之外完成。