Java 在枚举中实现内部接口时的循环继承
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/23811904/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Cyclic inheritance when implementing inner interface in enum
提问by skiwi
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
.
它在第一行给出了一个循环继承错误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.
我不完全明白发生了什么。我首先实现了一个抽象类,并希望让枚举扩展它,直到我意识到枚举不能扩展类。现在我尝试(ab)使用 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
.
我对为什么我的代码无法编译的思考过程感兴趣,我试图通过将重复的代码拉入safeCreateBuilder
.
采纳答案by QuestionMarcs
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).
据我所知,这是不允许的。您需要在类之外定义接口(在本例中为 Enum)。
Like so:
像这样:
Interface B {
}
Class A implements Interface B {
}
Best practice is probably to break them up into different files.
最佳实践可能是将它们分成不同的文件。
回答by Danny
FusionStat
is defined as implementing MonsterStatBuilderHelper
, yet inside this enum you try to declare the interface MonsterStatBuilderHelper
which extends MonsterStatBuilder
.
FusionStat
被定义为实现MonsterStatBuilderHelper
,但在这个枚举中,您尝试声明MonsterStatBuilderHelper
扩展的接口MonsterStatBuilder
。
I suspect that what you want to do is simply define the method createBuilder()
inside your enum.
我怀疑您想要做的只是createBuilder()
在枚举中定义方法。
If you do actually want to define the MonsterStatBuilderHelper
interface, this needs to be done outside the class/enum.
如果您确实想定义MonsterStatBuilderHelper
接口,则需要在类/枚举之外完成。
回答by Ankit Bharti
You can see here what's mistake in your code ?
你可以在这里看到你的代码有什么错误?
public enum FusionStat implements MonsterStatBuilderHelper {
protected interface MonsterStatBuilderHelper extends MonsterStatBuilder {
}
}
first you are implementing MonsterStatBuilderHelper
for FusionStat
enum again inside the enum
written one more time with the same name interface MonsterStatBuilderHelper
which you are already implementing for top level enum
so that's why you are getting cyclic inheritanceerror.
首先要实现MonsterStatBuilderHelper
对FusionStat
内部再次枚举enum
写一次具有相同名称的界面MonsterStatBuilderHelper
,你已经为顶级落实enum
所以这就是为什么你得到循环继承错误。
You can see below some few cyclic inheritance example
你可以在下面看到一些循环继承的例子
//1st example
class Person extends Person {} //this is not possible in real world, a Person itself child and parent both ?
//2nd example
class Human extends Person{}
class Person extends Human{}
Notes : cyclic inheritance is not supported in java because logically it's not possible.
注意:java 不支持循环继承,因为从逻辑上讲这是不可能的。