Циклическое наследование при реализации внутреннего интерфейса в перечислении
у меня есть следующая реализация, которая дает ошибку компилятора:
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
.
2 ответа:
Это было бы потому, что вы реализуете (кодирование) интерфейс, который вы реализуете (наследование) внутри класса, который наследует от этого класса.
Я хотел бы сделать это предложение лучше...
но вот-наглядный пример.
Class A implements Interface B { Interface B { } }
насколько я знаю, это не разрешено. Вам нужно определить интерфейс вне класса (в данном случае перечисление).
вот так:
Interface B { } Class A implements Interface B { }
Лучшая практика-это возможно чтобы разбить их на разные файлы.
FusionStat
определяется как реализацияMonsterStatBuilderHelper
, однако внутри этого перечисления вы пытаетесь объявить интерфейсMonsterStatBuilderHelper
которая расширяетMonsterStatBuilder
.Я подозреваю, что то, что вы хотите сделать, это просто определить метод
createBuilder()
внутри вашего перечисления.если вы действительно хотите определить
MonsterStatBuilderHelper
интерфейс, это должно быть сделано вне класса / перечисления.