Frage

Sorry, ich dachte, das ein Erbe Frage war: es war eine Arraylist Frage die ganze Zeit

!

Ok, mein Problem ist präziser als ich dachte. So habe ich zwei Familien von Klassen. Karten und Zonen. Zonen sind Boxen für Karte.

Die ersten beiden Subklassen von Zone, ZoneList und ZoneMap sollen die Speicherung Karten zwei verschiedene Weisen sein. Weitere Unterklassen, wie Hand, und Pokerhand, haben ihre eigenen spezifische Möglichkeiten der Zusammenarbeit mit den Karten zu tun sie speichern.

Wenn es kompliziert ist, dass Karten auch Subklassen, wie Pokercard hat, und dass die Unterklassen von ZoneList und ZoneMap sollen diejenigen organisieren.

So in ZoneList ich protected ArrayList<Card> cardBox; haben und in Pokerhand ich voraussichtlich in der Lage sein cardBox = new ArrayList<PokerCard>(); zu erklären, da Pokercard eine Karte ist. Der Fehler Ich erhalte, ist, dass ich offenbar nicht zwischen Karte und GangCard werfen kann, wenn es um Arraylisten kommt ... Also ich habe versucht, dies zu beheben, indem Sie einfach erneut deklariert CardBox als private ArrayList<PokerCard> cardBox; innen Pokerhand, aber das führte zu dem Versteck, das wurde abgehört bis mein Programm.

SO wirklich, ist die Frage nach Gießen zwischen Arraylisten? Java sagt mir, ich kann nicht, so dass alle Ideen, wie kann ich?

z.

War es hilfreich?

Lösung

Wenn ich Sie richtig verstehe, dann sollten Sie erklären:

public class ZoneList<T extends Card> {
   protected List<T> cardBox;
}

public class PokerHand extends ZoneList<PokerCard> {
   public PokerHand() {
      cardBox = new ArrayList<PokerCard>();
   }
}

Andere Tipps

Marc und kolstae haben gute Antworten in Bezug auf gegeben, wie um das Problem zu bekommen, aber ich denke, es lohnt sich zu erklären Warum Ihre ursprüngliche Code funktioniert nicht.

Zur Vereinfachung, neige ich dazu, das Problem in Bezug auf die Frucht zu bringen. Angenommen, wir haben:

List<Banana> bananaBunch = new ArrayList<Banana>();
List<Fruit> fruitBowl = bananBunch;
fruitBowl.add(new Apple());

Wenn dies erlaubt ist, haben wir am Ende mit einem Apfel in einem Bündel Bananen auf, die offensichtlich eine schlechte Sache ist. Also, wo ist das Problem? Die erste Zeile muss in Ordnung sein, und die dritte Zeile hat in Ordnung zu sein - Sie jede Art von Obst zu List<Fruit> hinzufügen können - so das Problem hat in der zweiten Zeile sein. Das ist, was verboten ist, genau diese Art von Problem zu vermeiden.

Ist diese Hilfe überhaupt?

Zunächst einmal, es ist in der Regel eines besseren Praxis Getter / Setter-Methoden zu verwenden, als Eigenschaften direkt zugreifen, besonders wenn man dabei eine Menge komplizierten Erbe sein werden.

Wie für das Generika-Problem, könnte man versuchen, die CardBox Getter in der übergeordneten Klasse definieren (oder Top-Level-Interface / abstrakte Klasse) als:

protected ArrayList<? extends Card> getCardBox();

Auf diese Weise können Sie es in Subklassen ovverride und haben sie eine Liste von jeder Art von Unterklasse der Karte zurück.

Eine Möglichkeit, dies zu tun ist durch Gießen erste Arraylist:

ArrayList<Card> cards = (ArrayList<Card>)(ArrayList<?>) (pokerCardObjects);

Weitere Alternativen ohne Casting:

Mit Streams:

ArrayList<Card> cards = pokerCardObjects.stream().collect(Collectors.toCollection(ArrayList::new);

oder eine neue Arraylist zu erstellen:

ArrayList<Card> cards = new ArrayList<>(pokerCardObjects);

Wie bereits erwähnt, kann man nicht werfen ArrayList<PokerCard> ArrayList<Card>, aber Sie können ArrayList<PokerCard> gießen ArrayList<? extends Card>. Oder eine bessere Nutzung List<? extends Card> als Rückgabewert, da Sie wahrscheinlich verlassen Sie sich nicht auf die Arraylist Implementierung ohnehin:

protected ArrayList<? extends Card> getCardBox();

Was Ihre Frage im Kommentar, sollte die Konstruktion arbeiten, wie Sie beschrieben: List<? extends Card> list = new ArrayList<Card>();. Sie haben wahrscheinlich die Liste zu füllen, so dass die Methode ist wahrscheinlich so etwas wie folgt aus:

protected ArrayList<? extends Card> getCardBox() {
    List<Card> list = new ArrayList<Card>();
    list.add(pokerCard1);
    list.add(pokerCard2);
    return java.util.Collections.unmodifiableList(list);
}

Das wird auf abhängen, was die Zugriffskontrolle auf der Arraylist in Zonelist. Meine Vermutung von der Debugger-Anweisung ist, dass es entweder nicht markiert, öffentlich oder geschützt. Eine Unterklasse kann „ausblenden“, um eine Elternklasse Variable es Zugriff hat durch eine Variable mit dem gleichen Namen zu definieren. Sie können auch this Schlüsselwort beziehen sich auf die jeweilige Objektinstanz und super Schlüsselwort verwenden, um die Eltern zu beziehen.

Hier ist eine gute Verbindung zu dem grundlegenden Zugriffskontrolle in Java:

http://java.sun.com/docs /books/tutorial/java/javaOO/accesscontrol.html

Das Sie könnte auch hilfreich

http://java.sys-con.com/node/46344

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top