casten von Objekten aus einer ArrayList

  • Themenstarter Themenstarter terminator1979
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
T

terminator1979

Gast
Hallo!

Ich habe eine ArrayList, welche verschiedene Objekte enthaelt. Diese Objekte sind Instanzen verschiedener Klassen, also die Objekte haben verschiedene Typen.
Das Fuellen der ArrayList sieht so aus:
Code:
private ArrayList aListe = new ArrayList();
...
aListe.add(new CLASS1());
aListe.add(new CLASS2());
aListe.add(new CLASS1());
...

Beim Herausholen der Objekte aus der Liste ergibt sich nun mein Problem:
Wie kann ich das Element der Liste wieder als Objekt bekommen?
Meine Idee ist es, das Element zu casten:
Code:
//innerhalb einer FOR-Schleife tue ich folgendes fuer jedes Element des Arrays:
String ObjectType = aListe.get(n).getClass().getName();
if (ObjectType == "CLASS1")
   {
	     CLASS1 Object1 = (CLASS1) aListe.get(n);
   }

Abgesehen davon, dass mir das mit dem StringVergleich nicht recht gefaellt, klappt das auch nur
im "einfachen Fall", d.h. wenn meine Klasse CLASS1 keine Unterklassen besitzt.
Die Klassen CLASS1 usw. bestehen aber aus Unterklassen.
Code:
public class CLASS1
{
   public String test1;
   public SUBCLASS1 subclass;

   public class SUBCLASS1
   {
       public String substring1;
       ...
   }

   ...
}

Ich kann mit meiner CastingVariante jetzt auf das Attribut "test1" zugreifen, nicht aber das Attribut "substring1",
da bekomme ich eine Fehlermeldung (NullPointerException):
Code:
String ObjectType = aListe.get(n).getClass().getName();
if (ObjectType == "CLASS1")
   {
        CLASS1 Object1 = (CLASS1) aListe.get(n);
        String sBlub;
        sBlub = Object1.test1;
        System.out.println(sBlub);
        sBlub = Object1.subclass.substring1; //FEHLERMELDUNG
        System.out.println(sBlub);
   }

Die Fehlermeldung lautet
"Exception in thread "main" java.lang.NullPointerException"

Wer kann mir sagen, wo der Fehler liegt und was ich anders machen muss, um auf meine SubClass zugreifen zu koennen?
Vielleicht gibt es ja eine andere Zuweisung, alternativ zum Casting?
Ich koennte auch mit einem anderen Loesungsansatz ohne ArrayList leben, wichtig ist aber, dass ich verschiedene Objekte verschiedener Typen habe und diese irgendwie in eine Liste packen muss, welche ich spaeter auslese.

Vielen Dank schon mal fuer eure Muehen!

Gruss,
Termi.
 
ICh hoffe ich habe nichts überlesen, aber warum benutzt du für die Objekte, die du aus der Liste holst, nciht instanceof, um sie je nach Typ dann richtig zu casten?
 
Die NullPointerException sagt aus, dass subclass null ist. Hat also nichts mit einem Casting-Problem zu tun.

Abgesehen davon:
- Subclass, so wie du es verwendest und benannt hast, ist keine Sub-Klasse im Sinne von Vererbung.
- Klassenvariablen sollten private sein und nur über Getter und Setter-Methoden verfügbar sein.
- Für die Benennung von Variablen und Klassen gibt es Java-Code-Conventions.
- Strings werden mit .equals(...) verglichen.

@Evolver
Hab ich mir beim ersten mal durchlesen auch gedacht.

ms
 
Benutze ein gemeinsames Interface für CLASS1 und CLASS2, dann brauchst du nur noch auf dieses eine Interface zu casten, und zwar immer.
Wenn du dann noch Java 5 oder höher einsetzt, kannst du dir so den Cast ganz sparen 🙂
 
Hallo!

Danke fuer eure Antworten.
Das Problem lag (wie meistens) zwischen Monitor und Stuhl. Ich habe die Klassen falsch definiert, deswegen gab es an dieser Stelle keine Objekte zum zugreifen, und daher auch die NullPointerException.

Evolver hat gesagt.:
ICh hoffe ich habe nichts überlesen, aber warum benutzt du für die Objekte, die du aus der Liste holst, nciht instanceof, um sie je nach Typ dann richtig zu casten?
Also ich caste jetzt so:
Code:
if (aListe.get(n) instanceof CLASS1)
{
   ...
}

ms hat gesagt.:
Die NullPointerException sagt aus, dass subclass null ist. Hat also nichts mit einem Casting-Problem zu tun.
Der Fehler liegt bereits beim Erzeugen der Objekte bzw. in meiner Klassendefinition.
Das Casten funktioniert also prinzipiell.


ms hat gesagt.:
Abgesehen davon:
- Subclass, so wie du es verwendest und benannt hast, ist keine Sub-Klasse im Sinne von Vererbung.
Daher kam auch mein Fehler, dass ich das falsch benutzt habe.


ms hat gesagt.:
- Klassenvariablen sollten private sein und nur über Getter und Setter-Methoden verfügbar sein.
Da hast du natuerlich recht, ich wollte auch kein verkaufsfertiges Programm posten, sondern lediglich das Prinzip meines Problems schildern. Dabei erschien mir das angeben von Gettern und Settern an der Stelle ueberfluessig.

ms hat gesagt.:
- Für die Benennung von Variablen und Klassen gibt es Java-Code-Conventions.
- Strings werden mit .equals(...) verglichen.
Wieder hast du recht. Ich arbeite mich gerade in Java ein. Entschuldigung also fuer die Nichteinhaltung der Conventions.

Danke und Gruss,
Termi.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben