enum에서 내부 인터페이스를 구현할 때 순환 상속
컴파일러 오류를 제공하는 다음 구현이 있습니다.
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
.
나는 무슨 일이 일어나고 있는지 정확히 보지 못합니다. 나는 처음에 추상 클래스를 구현했고 enum이 클래스를 확장 할 수 없다는 것을 깨달을 때까지 enum이 그것을 확장하도록하고 싶었습니다. 이제 Java 8의 기본 메서드를 (남용) 사용하려고합니다.
내 코드가 컴파일되지 않는 이유에 대한 생각 프로세스에 관심이 있습니다 safeCreateBuilder
. 중복 된 코드를 내부로 가져 와서 코드 중복을 제거하려고했습니다 (여전히 그렇게해야 함) .
이는 해당 클래스에서 상속하는 클래스 내부에서 구현 (상속)하는 인터페이스를 구현 (코딩)하고 있기 때문입니다.
그 문장을 더 좋게 만들 수 있으면 좋겠다 ...
그러나 여기에 시각적 인 예가 있습니다.
Class A implements Interface B {
Interface B {
}
}
As far as I know, this is not allowed. You need to define the interface outside of the class (in this case, an Enum).
Like so:
Interface B {
}
Class A implements Interface B {
}
Best practice is probably to break them up into different files.
FusionStat
is defined as implementing MonsterStatBuilderHelper
, yet inside this enum you try to declare the interface MonsterStatBuilderHelper
which extends MonsterStatBuilder
.
I suspect that what you want to do is simply define the method createBuilder()
inside your enum.
If you do actually want to define the MonsterStatBuilderHelper
interface, this needs to be done outside the class/enum.
ReferenceURL : https://stackoverflow.com/questions/23811904/cyclic-inheritance-when-implementing-inner-interface-in-enum
'IT story' 카테고리의 다른 글
통합 테스트 전체 객체를 Spring MVC 컨트롤러에 게시 (0) | 2021.01.06 |
---|---|
고 루틴에서 반환 값 잡기 (0) | 2021.01.06 |
휠 형식에서 numpy를 설치할 수 없습니다. (0) | 2021.01.06 |
수학 파서의 스마트 디자인? (0) | 2021.01.06 |
원형 차트의 색상을 선택하는 방법은 무엇입니까? (0) | 2021.01.06 |