Vererbung Wie auf Subklasse zugreifen + übergeben?

DerBaumstamm

Mitglied
Hallo,

ich bin zwar noch relativ neu in Java, habe aber schon Programmierkenntnisse in anderen Sprachen, habe ich mich deshalb entschlossen es nicht in der Anfängersektion zu schreiben.

Ich habe hier eine Klasse "Items" und eine Unterklasse von Items namens "Sammelbares".
Desweiteren habe ich die Klasse "Inventar"

Das Inventar enthält eine Arrayliste vom Typ Items. Diese Liste möchte ich nun durchgehen (davon allerdings nur alle Collectables) und dann das gefundene Sammelbares übergeben.

Vom Prinzip her gar nicht so schwer. pName ist ein Parameter vom Typ Zeichenkette also String.

Java:
for(Items tempItem : itemList)
{
 if(tempItem.getName().equals(pName))
  {
    return tempItem
  }
}

Das Problem ist, ich spreche hiermit ja nur Objekte vom Typ Items an. Ich müsste also in der Schleife noch eine Schleife machen, was erst überprüft ob das Item (Superklasse) vom Typ Sammelbares (Unterklasse) ist und dann nicht das Object Items sondern das Object Sammelbares zurückgeben.

Ich habe gelesen, dass man nicht "downcasten" darf. Jetzt stellt sich mir die Frage wie man das, außer alles umschreiben (statt Itemsarray nen Sammelbaresarray etc.) lösen könnte.
 
Zuletzt bearbeitet:
Warum brauchst du eine Überprüfung? Du hast eine Liste, in der viele Objekte sind, die alle von Items (Klassennamen immer Einzahl) erben. Jetzt willst du wissen, was davon ein Sammelbares ist.
Dazu musst du einfach die Schleife so abändern, dass sie über alle Sammelbare Objekte läuft und diese in tempItem speichert.

Das mit den downcasten bezieht sich wahrscheinlich eher auf primitive Typen, wo dabei schon mal Müll rauskommen kann.
 
@Gucky: Das ist ja das was ich will. Nur weiß ich nciht wie ich die Schleife so abändern kann, ich könnte es mit "instanceof" versuchen aber funktioniert das überhaupt? Kann ich mit Instanceof von der Superklasse auf die Unterklasse zugreifen? Ich dachte das geht immer nur andersherum.

Und wie speichere ich das Objekt Items in Sammelbares? Dafür müsste ich ja downcasten.
Schließlich schiebe ich einfach eine Superklasse in einer Unterklasse und sage dem Compiler "passt schon".

//edit: Würde dann so ausschauen, aber das sieht mir irgendwie nach einer "unsauberen" Lösung aus.
Java:
public Sammelbares getSammelbarByName(final String pName)
    {
        for(Item tempItem : itemList)
        {
            if(tempItem instanceof Sammelbares && tempItem.getName().equals(pName))
            {
                Sammelbares tempcollectable  = (Sammelbares) tempItem;
                return tempcollectable;
            }
        }
        return null;
    }
 
Zuletzt bearbeitet:
Eine Möglichkeit wäre es noch die Liste zu sortieren und abzuspeichern, wo die anderen Typen anfangen.

Downcasten musst du nicht. Die Schleife sähe so aus:
Java:
for (Sammelbar tmpSam:itemList){
   tuWas();
}

Die Schleife heißt for-EACH also für jedes Objekt, dass in die, vor dem Doppelpunkt deklarierte, Variable passt führe den Schleifenrumpf durch.
 
Da kommt die Fehlermeldung "incompatible types" da die Arrayliste itemList ja Objekte vom Typ Items beinhaltet.

//edit: Die Arrayliste ist ja fest für Objekte vom Typ Items deklariert also : ArrayList<Items>. Dürfte also daran liegen, dass dein Code nicht funktioniert. Habe meinen Code bisher nicht getestet, wenn jemand noch eine andere Idee hat wie man das ganze sauberer gestalten könnte gerne Bescheid sagen.
 
Zuletzt bearbeitet:

Zurück
Oben