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

ski*_*iwi 55 java enums interface

我有以下实现,给出了编译器错误:

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);
}
Run Code Online (Sandbox Code Playgroud)

它在第一行给出了循环继承错误involving FusionStat.

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

我感兴趣的是关于为什么我的代码不能编译的思考过程,我试图删除代码重复(仍然必须这样做),通过拉动里面的重复代码safeCreateBuilder.

小智 124

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

我希望我能把这句话变得更好......

但这是一个视觉例子.

Class A implements Interface B {

    Interface B {
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这是不允许的.您需要在类之外定义接口(在本例中为Enum).

像这样:

Interface B {
}

Class A implements Interface B {
}
Run Code Online (Sandbox Code Playgroud)

最佳做法可能是将它们分解为不同的文件.

  • 所以这是Java中一个完全随意的限制,没有技术原理,对吧?我理解用这种语言创造大量锅炉板是"最佳实践". (13认同)
  • 无法真正理解问题的本质,但我可以确认我还修复了它在不同文件中定义接口的问题.谢谢.+1 (6认同)
  • 接口类始终是静态的(因此不能添加 static 限定符)。这应该意味着这不是问题......(但我今天在 Android Studio 中看到了同样的情况) (2认同)