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

时间:2014-05-22 16:00:52

标签: java interface enums

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

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内拉出重复的代码。

3 个答案:

答案 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之外完成。