Casting zwischen ArrayLists in Java
Sorry, ich dachte, das war eine erbschaft Frage: es war eine ArrayList Frage alle zusammen!
Ok, mein problem ist spezieller als ich gedacht habe. Also ich habe zwei Familien von Klassen. Karten und Zonen. Zonen sind Kartons für holding-Karte.
Den ersten beiden Unterklassen der Zone, ZoneList und ZoneMap gemeint sind zwei unterschiedliche weisen, die Speicherung der Karten. Weitere Unterklassen, wie die Hand, und PokerHand, haben Ihre eigenen spezifischen Art und Weise des Umgangs mit den Karten, die Sie speichern.
Wo es kompliziert ist, die Karte hat auch Unterklassen, wie PokerCard, und dass sich die Unterklassen von ZoneList und ZoneMap gemeint sind, organisieren diese.
So, in ZoneList ich habe protected ArrayList<Card> cardBox;
und in PokerHand erwartet, dass ich in der Lage sein, zu erklären cardBox = new ArrayList<PokerCard>();
seit PokerCard ist eine Karte. Die Fehler ich erhalte, ist, dass ich anscheinend nicht wirken kannst zwischen Karte und GangCard, wenn es um die ArrayLists... Also habe ich versucht dieses Problem beheben, indem Sie einfach redeclaring cardBox als private ArrayList<PokerCard> cardBox;
innen PokerHand, aber das führte zu dem Versteck, dass der Lauschangriff war mein Programm.
ALSO wirklich, die Frage ist, über casting-zwischen ArrayLists? Java sagt mir, ich kann nicht, also irgendwelche Ideen auf, wie ich kann?
z.
- Kommen Sie, daran zu denken! Eine andere situation, die ich denke, ähnlich ist, wenn ich Anrufe getElementAt(); und es gibt mir ein GImage, die ich auch nicht behandeln wie ein GImage! Java bekommt alle bis in die Arme, wenn ich versuche den Aufruf GImage.getName(); oder so, denn es ist kein Bild es ist ein Objekt... !
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich Sie richtig verstanden habe, sollte man wohl erklären:
Marc und kolstae gegeben haben gute Antworten in Bezug auf, wie man um das problem, aber ich denke es lohnt sich zu erklären warum Ihre original-code funktioniert nicht.
Einfachheit halber, habe ich eher das problem in Bezug auf die Frucht. Nehmen wir an, wir haben:
Wenn das erlaubt ist, wir am Ende mit einem Apfel in ein Bündel Bananen, das ist natürlich eine schlechte Sache. Also, wo ist das problem? Die erste Zeile ist in Ordnung zu sein, und die Dritte Zeile ist in Ordnung zu sein - Sie können jede Art von Obst zu
List<Fruit>
- so, das problem hat sich in der zweiten Zeile. Das ist das, was verboten ist, gerade um zu vermeiden diese Art von Problem.Hilft das überhaupt?
Zuerst von allen, ist es meist besser, die Praxis zu verwenden getter/setter-Methoden als der Zugriff auf Eigenschaften direkt, vor allem, wenn du gehst zu tun eine Menge von komplizierten Vererbung.
Als für die Generika-problem, könnten Sie versuchen, die Definition der cardBox getter in der Oberklasse (oder top-level-interface/abstrakte Klasse):
Diese Weise können Sie ovverride es in Unterklassen und haben Sie wieder eine Liste von jedem Typ der Unterklasse der Karte.
Einen Weg, das zu tun, von casting zu ArrayList erste:
Andere alternativen ohne casting:
Mit streams:
Oder erstellen einer neuen ArrayList:
Wie gesagt, Sie können nicht gegossen
ArrayList<PokerCard>
zuArrayList<Card>
, aber Sie werfen kannArrayList<PokerCard>
zuArrayList<? extends Card>
. Oder besser verwendenList<? extends Card>
als Ihren Rückgabewert, weil Sie wahrscheinlich verlassen Sie sich nicht auf die ArrayList-Implementierung sowieso:Als für deine Frage in den Kommentar, die Konstruktion sollte so funktionieren, wie Sie beschrieben:
List<? extends Card> list = new ArrayList<Card>();
. Sie haben wahrscheinlich füllen Sie Ihre Liste, so ist die Methode, ist wahrscheinlich so etwas wie dieses:Dies ist, hängt davon ab, was die Zugriffskontrolle wird auf die Arraylist in
Zonelist
. Meine Annahme von der debugger-Anweisung ist, dass es entweder eine ungekennzeichnete, public oder protected. Eine Unterklasse kann "Verstecken" einer übergeordneten Klasse "variable" es hat Zugriff auf die Definition einer Variablen mit dem gleichen Namen. Sie können auchthis
keyword-verweisen auf ein bestimmtes Objekt-Instanz undsuper
Schlüsselwort zu finden, um das übergeordnete Element.Hier ist ein guter link auf "basic access control" in Java:
http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
Diesem vielleicht finden Sie auch hilfreiche
http://java.sys-con.com/node/46344