Entschuldigung, ich dachte, das wäre eine Vererbungsfrage: Es war die ganze Zeit eine ArrayList-Frage!
Ok, mein Problem ist spezifischer als ich dachte. Also habe ich zwei Klassenfamilien. Karten und Zonen. Zonen sind Boxen für die Karte.
Die ersten beiden Unterklassen von Zone, ZoneList und ZoneMap sind zwei verschiedene Arten zum Speichern von Karten. Weitere Unterklassen wie Hand und PokerHand haben ihre eigenen spezifischen Möglichkeiten, mit den Karten umzugehen, die sie speichern.
Wo es kompliziert wird, ist, dass Card auch Unterklassen hat, wie PokerCard, und dass die Unterklassen von ZoneList und ZoneMap diese organisieren sollen.
Also in ZoneList habe ich protected ArrayList<Card> cardBox;
und in PokerHand habe ich erwartet, cardBox = new ArrayList<PokerCard>();
deklarieren zu können, da PokerCard eine Karte ist. Der Fehler, den ich bekomme, ist, dass ich anscheinend nicht zwischen Karte und GangCard sprechen kann, wenn es um ArrayLists geht ... Also habe ich versucht, dies zu beheben, indem ich einfach cardBox als private ArrayList<PokerCard> cardBox;
in PokerHand deklarierte, aber das führte dazu, dass ich das versteckte hat mein Programm gestört.
Also, die Frage dreht sich um das Gießen zwischen ArrayLists? Java sagt mir, ich kann nicht, also irgendwelche Ideen, wie ich kann?
z.
Marc und kolstae haben gute Antworten darauf gegeben, wie man das Problem umgehen kann, aber ich denke, es lohnt sich zu erklären, warum Ihr ursprünglicher Code nicht funktioniert.
Um die Dinge zu vereinfachen, tendiere ich dazu, das Problem in Bezug auf Früchte zu stellen. Angenommen, wir haben:
%Vor% Wenn das erlaubt ist, landen wir mit einem Apfel in einem Haufen Bananen, was offensichtlich eine schlechte Sache ist. Also, wo ist das Problem? Die erste Zeile muss in Ordnung sein und die dritte Zeile muss in Ordnung sein - Sie können jede Art von Frucht zu List<Fruit>
hinzufügen - also muss das Problem in der zweiten Zeile stehen. Das ist verboten, um diese Art von Problem zu vermeiden.
Hilft das überhaupt?
Zunächst ist es in der Regel besser, Getter / Setter-Methoden zu verwenden, als direkt auf Eigenschaften zuzugreifen, besonders wenn Sie eine komplizierte Vererbung durchführen.
Was das generische Problem angeht, könnten Sie versuchen, den cardBox-Getter in der Oberklasse (oder der obersten Ebene / abstrakten Klasse) wie folgt zu definieren:
%Vor%Auf diese Weise können Sie sie in Unterklassen überschreiben und eine Liste aller Unterklassen von Card zurückgeben lassen.
Wie bereits erwähnt, kannst du ArrayList<PokerCard>
nicht auf ArrayList<Card>
werfen, aber du kannst ArrayList<PokerCard>
auf ArrayList<? extends Card>
werfen. Oder verwenden Sie besser List<? extends Card>
als Rückgabewert, da Sie sich wahrscheinlich sowieso nicht auf die ArrayList-Implementierung verlassen:
Wie bei Ihrer Frage im Kommentar sollte die Konstruktion wie beschrieben funktionieren: List<? extends Card> list = new ArrayList<Card>();
. Sie müssen wahrscheinlich Ihre Liste füllen, also ist die Methode wahrscheinlich etwa so:
Eine Möglichkeit, dies zu tun, besteht darin, zuerst in ArrayList zu konvertieren:
%Vor% Dies hängt davon ab, was die Zugriffskontrolle in der Arraylist in Zonelist
ist. Meine Annahme von der Debugger-Anweisung ist, dass es entweder nicht markiert, öffentlich oder geschützt ist. Eine Unterklasse kann die Variable einer übergeordneten Klasse, auf die sie zugreifen kann, ausblenden, indem sie eine Variable mit demselben Namen definiert. Sie können auch das Schlüsselwort this
verwenden, um auf die bestimmte Objektinstanz zu verweisen, und super
Schlüsselwort, um auf das übergeordnete Element zu verweisen.
Hier ist ein guter Link zur grundlegenden Zugriffskontrolle in Java:
Dies können Sie auch hilfreich finden