Héritage cyclique lors de l’implémentation d’une interface interne dans enum

J’ai l’implémentation suivante qui donne une erreur de compilation:

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

Il donne une erreur d’inheritance cyclique sur la première ligne involving FusionStat .

Je ne vois pas exactement ce qui se passe. J’avais d’abord implémenté une classe abstraite et je voulais laisser l’enum prolonger cela jusqu’à ce que je réalise que les énumérations ne peuvent pas étendre les classes. J’essaie maintenant de (ab) utiliser les méthodes par défaut de Java 8.

Je suis intéressé par le processus de reflection sur la raison pour laquelle mon code ne comstack pas, j’essayais de supprimer la duplication de code (rest à faire), en tirant le code dupliqué dans safeCreateBuilder .

Ce serait parce que vous implémentez (codez) l’interface que vous implémentez (héritez) à l’intérieur de la classe héritant de cette classe.

J’aimerais pouvoir mieux faire cette phrase …

Mais voici un exemple visuel.

 Class A implements Interface B { Interface B { } } 

Pour autant que je sache, cela n’est pas autorisé. Vous devez définir l’interface en dehors de la classe (dans ce cas, un Enum).

Ainsi:

 Interface B { } Class A implements Interface B { } 

La meilleure pratique consiste probablement à les diviser en différents fichiers.

FusionStat est défini comme implémentant MonsterStatBuilderHelper , mais à l’intérieur de cette énumération, vous essayez de déclarer l’interface MonsterStatBuilderHelper qui étend MonsterStatBuilder .

Je soupçonne que ce que vous voulez faire est simplement de définir la méthode createBuilder() dans votre enum.

Si vous voulez réellement définir l’interface MonsterStatBuilderHelper , cela doit être fait en dehors de la classe / enum.