• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Java: Vector mit verschiedenen Objekttypen

Mitglied seit
31.10.2004
Beiträge
289
Reaktionen
0
Hallo,

ich hab zwei Klassen Camel und LeaderCamel, wobei LeaderCamel direkt von Camel erbt und keine weiteren Methoden/Variablen einführt.

Objekte der beiden Klassen sollen in einer Liste "Karawane" gespeichert werden, ich hab mich für den Datentyp Vector entschieden. Mein Problem ist jetzt aber, dass die Liste Objekte beider Klassen speichern soll, sie aber nicht korrekt auslesen kann, da ein Cast von LeaderCamel zu Camel nicht funktioniert (Die Unterscheidung ist aber wichtig fürs Programm).

Hat einer eine Idee, wie man Objekte korrekt casten kann?

Danke für Antworten :elefant:
 
Mitglied seit
01.06.2007
Beiträge
761
Reaktionen
0
Code:
if(object instanceof LeaderCamel)
{
     LeaderCamel leaderCamel = (LeaderCamel)object;
}
else if(object instanceof Camel)
{
     Camel camel = (Camel)object;
}
 
Mitglied seit
31.10.2004
Beiträge
289
Reaktionen
0
Ich hab hier diesen Auszug als Beispiel, ich will mir nur die Zustände der Kamele in der Liste ausgeben lassen.

Allerdings hab ich jetzt zwei Objekte mit unterschiedlichen Namen, wie kann ich die Ausgabe für beide benutzen? Wenn ich in den if's den neuen Objekten den gleichen Namen "camel" gebe und unten versuche, darauf zuzugreifen, meckert Eclipse und meldet "leaderCamel cannot be resolved". Irgendwelche Ideen?

Code:
public void showCaravan() {
	for(Object object : karawane) {
		if(object instanceof LeaderCamel)
		{
		     LeaderCamel camel = (LeaderCamel)object;
		     
		}
		else if(object instanceof Camel)
		{
		     Camel camel = (Camel)object;
		}
                System.out.println("maximale Geschwindigkeit: "+ camel.getMaxpace());
                System.out.println("Beladung: "+ camel.getLoad());
		System.out.println("aktuelle Geschwindigkeit: "+ (camel.getMaxpace() - camel.getLoad()));
		System.out.println();
			
         }
}
 
Mitglied seit
02.09.2002
Beiträge
3.281
Reaktionen
106
Öh - ohne das jetzt ausprobiert zu habe, aber ansich musst du da garnix casten.
Also
Code:
public void showCaravan() {
	for(Camel camel : karawane) {
                System.out.println("maximale Geschwindigkeit: "+ camel.getMaxpace());
                System.out.println("Beladung: "+ camel.getLoad());
		System.out.println("aktuelle Geschwindigkeit: "+ (camel.getMaxpace() - camel.getLoad()));
		System.out.println();
			
         }
}
 
Mitglied seit
23.09.2005
Beiträge
1.426
Reaktionen
0
wenn es in beiden klassen die methoden mit den namen gibt ( was er ja am anfang im prinzip gesagt hat ) dürfte das auch ohne gehen ja oO
 
Mitglied seit
01.06.2007
Beiträge
761
Reaktionen
0
Pfff, wenn du natürlich nur die Methoden der Basisklasse benutzt, dann brauchst auch nix casten...

Und dein Eclipse findet die Variablen deshalb nicht, weil sie in den if-else Blöcken deklariert wurden und daher außerhalb nicht sichtbar sind.
 
Mitglied seit
31.10.2004
Beiträge
289
Reaktionen
0
Mein Fehler war ausserdem, dass ich zum Fehlersuchen die Dateien kopiert und umbenannt hab (z.B. Camel -> Camel 2), AUSSER bei LeaderCamel, der hat noch von Camel geerbt. Dadurch gabs dann Fehler beim Versuch, ein LeaderCamel in einen Vector<Camel2> zu bringen.
 

RRA^StArFiRe

Guest
Original geschrieben von moepehl
... da ein Cast von LeaderCamel zu Camel nicht funktioniert...

wieso wolltest du überhaupt so einen cast durchführen?
und wie sieht deine vectordeklaration aus?
du hast doch

public class Camel {
}

und

public class Leadercamel extends Camel {
}

folglich kann dein vector nur mit:
... = new Vector<Camel>(); oder
... = new Vector<Object>(); parametrisiert sein.
wahrscheinlich eher object, so wie du da iterierst.

willst du in den vector noch andere datentypen reinmachen?
ansonsten ist das n etwas schlechter stil. besser du packst den in der hierarchie 'niedrigstmöglichen' (mir ist das wort entfallen x_X) erreichbaren datentypen rein.
dann kannst auch gleich mit:

for(Camel bla : karawane) { }
den vector durchwandern und ersparst dir einiges an verwirrung und eventuellen castfehlern, denn ein cast von unterklasse zur superklasse funktioniert nicht. ;)
 
Mitglied seit
08.03.2004
Beiträge
1.574
Reaktionen
0
ich versteh jetzt noch nicht, warum man überhaupt von leadercamel zu camel casten will und nicht andersrum...
 
Oben