Zyklische Vererbung bei der Implementierung der inneren Schnittstelle in enum

Lesezeit: 3 Minuten

Ich habe die folgende Implementierung, die einen Compilerfehler gibt:

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

Es gibt einen zyklischen Vererbungsfehler in der ersten Zeile involving FusionStat.

Ich sehe nicht genau, was los ist. Ich hatte zuerst eine abstrakte Klasse implementiert und wollte das Enum erweitern lassen, bis mir klar wurde, dass Enumerationen Klassen nicht erweitern können. Jetzt versuche ich, die Standardmethoden in Java 8 (ab)zuverwenden.

Ich interessiere mich für den Denkprozess darüber, warum mein Code nicht kompiliert wird. Ich habe versucht, die Codeduplizierung zu entfernen (muss dies noch tun), indem ich den duplizierten Code hineinziehe safeCreateBuilder.

Dies liegt daran, dass Sie die Schnittstelle, die Sie implementieren (vererben), innerhalb der Klasse implementieren (codieren), die von dieser Klasse erbt.

Ich wünschte, ich könnte diesen Satz besser machen …

Aber hier ist ein visuelles Beispiel.

Class A implements Interface B {

    Interface B {
    }
}

Soweit ich weiß ist das nicht erlaubt. Sie müssen die Schnittstelle außerhalb der Klasse definieren (in diesem Fall eine Enum).

So:

Interface B {
}

Class A implements Interface B {
}

Am besten ist es wahrscheinlich, sie in verschiedene Dateien aufzuteilen.

  • Rechts! Es ist immer gut, Ihre Schnittstellen in verschiedenen Dateien zu definieren (in einem speziellen Paket?)

    – Amol Desai

    15. Oktober 2015 um 6:25 Uhr

  • Ich kann die Art des Problems nicht wirklich verstehen, aber ich kann bestätigen, dass ich es auch behoben habe, indem ich die Schnittstelle in einer anderen Datei definiert habe. Vielen Dank. +1

    – voghDev

    19. Oktober 2015 um 5:35 Uhr

  • Das war poetisch und doch klar in einer Zeile erklärt. +1.

    – Talha

    11. November 2016 um 6:43 Uhr

  • Das ist also eine völlig willkürliche Einschränkung in Java ohne technische Begründung, richtig? Ich verstehe es als “Best Practice”, enorme Mengen an Textbausteinen in dieser Sprache zu erstellen.

    – Benutzer239558

    24. Juli 2017 um 10:03 Uhr


  • Schnittstellenklassen sind immer statisch (aus diesem Grund können Sie den statischen Qualifizierer nicht hinzufügen). Das sollte bedeuten, dass dies kein Problem ist … (aber ich sehe das gleiche heute in Android Studio)

    – Nick Cardoso

    15. Mai 2018 um 12:28 Uhr

Sie können hier sehen, was der Fehler in Ihrem Code ist?

public enum FusionStat implements MonsterStatBuilderHelper {
   protected interface MonsterStatBuilderHelper extends MonsterStatBuilder {

   }
}

Zuerst implementieren Sie MonsterStatBuilderHelper zum FusionStat enum wieder innerhalb der enum noch einmal mit dem gleichen Namen Schnittstelle geschrieben MonsterStatBuilderHelper die Sie bereits für Top-Level implementieren enum deshalb bekommst du zyklische Vererbung Error.

Nachfolgend sehen Sie einige Beispiele für zyklische Vererbung

//1st example 
class Person extends Person {}  //this is not possible in real world, a Person itself child and parent both ?

//2nd example 
class Human extends Person{}
class Person extends Human{}

Hinweise: Zyklische Vererbung wird in Java nicht unterstützt, da dies logischerweise nicht möglich ist.

Benutzer-Avatar
Danni

FusionStat wird als Umsetzung definiert MonsterStatBuilderHelperaber innerhalb dieser Aufzählung versuchen Sie, die Schnittstelle zu deklarieren MonsterStatBuilderHelper was sich erstreckt MonsterStatBuilder.

Ich vermute, Sie wollen einfach nur die Methode definieren createBuilder() in Ihrem Enum.

Wenn Sie das tatsächlich definieren wollen MonsterStatBuilderHelper Schnittstelle, muss dies außerhalb der Klasse/Aufzählung erfolgen.

1120640cookie-checkZyklische Vererbung bei der Implementierung der inneren Schnittstelle in enum

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy