关于java:在枚举中实现内部接口时的循环继承

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);
}

它在第一行involving FusionStat上产生循环继承错误。

我不知道到底发生了什么。我首先实现了一个抽象类,并希望让枚举扩展它,直到我意识到枚举不能扩展类为止。现在我尝试(ab)使用Java 8中的默认方法。

我对我的代码为什么不编译的思考过程很感兴趣,我试图通过在safeCreateBuilder中提取重复的代码来消除代码重复(仍然必须这样做)。


这是因为您正在实现(编码)您正在从该类继承的类内部实现(继承)的接口。

我希望我能把那句话写得更好…

但这里有一个可视的例子。

1
2
3
4
5
Class A implements Interface B {

    Interface B {
    }
}

据我所知,这是不允许的。您需要在类外部定义接口(在本例中是枚举)。

像这样:

1
2
3
4
5
Interface B {
}

Class A implements Interface B {
}

最佳实践可能是将它们分成不同的文件。


FusionStat定义为实现MonsterStatBuilderHelper,但在此枚举中,您尝试声明扩展MonsterStatBuilder的接口MonsterStatBuilderHelper

我怀疑您要做的只是在枚举中定义方法createBuilder()

如果您确实想要定义MonsterStatBuilderHelper接口,那么这需要在类/枚举之外完成。