Casting Problem

randomnick

Mitglied
Hallo, ich möchte einen Zoo mit Tieren simulieren (zunächst ohne Grafik). Dazu erstelle ich eine Tierliste (normale einfachverkettete Liste) und fülle diese mit Tieren aus der Klasse Tier, wo Attribute x und y für die Positionen bereitgestellt werden. Nun will ich eine Klasse "Affe" erstellen die von Tier erbt. In der main-Methode sieht das folgendermaßen aus:

Java:
package programme;

import klassen.Affe;
import klassen.TierListe;

public class ZooDemo {

	public static void main(String[] args) {
		TierListe t = new TierListe();
		t.add(10, 10);		
		Affe a = (Affe) t.getKopf();

		System.out.println("X: " + a.getX());
		System.out.println("Y: " + a.getY());
	}
	
}

Fehler:

Exception in thread "main" java.lang.ClassCastException: klassen.Tier cannot be cast to klassen.Affe
at programme.ZooDemo.main(ZooDemo.java:11)

Hier die Klasse TierListe:

Java:
package klassen;

public class TierListe {

	private Tier kopf;
	private TierListe next;

	public TierListe getNext() {
		return next;
	}

	public Tier getKopf() {
		return kopf;
	}

	public void del(Tier x) {
		if (kopf != null) {
			if (kopf == x) {
				kopf = next.getKopf();
				next = next.getNext();
			} else
				next.del(x);
		}
	}

	public void add(int x, int y) {
		if (kopf == null) {
			kopf = new Tier(x, y);
			next = new TierListe();
		} else
			next.add(x, y);
	}

}

Hier die Klasse Tier:

Java:
package klassen;

public class Tier {

	private int x;
	private int y;

	public Tier(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public int getX() {
		return x;
	}

	public int getY() {
		return y;
	}

	public void setX(int x) {
		this.x = x;
	}

	public void setY(int y) {
		this.y = y;
	}

	public void bewegen(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

Und hier die Klasse Affe:

Java:
package klassen;

public class Affe extends Tier {

	public Affe(int x, int y) {
		super(x, y);
	}

}


Warum funktioniert das Casting nicht?? ???:L
 
Du erstellst ja auch ein Tier mit new Tier() und willst es auf Affe casten. Das geht nicht. Du musst bei der add-Methode schon ein Tier übergeben bekommen, welches du erstellen willst.
Außerdem sieht bei dir der Aufbau der Liste nicht richtig an. Liste hat ein Kopfelement, dieses Element zeigt auf ein nächste Element, was wiederum auf ein nächstes Element zeigt.... Deine Implementierung könnte auch gehen, aber hm.
 
In der Liste steckt kein Affe.
In getKopf() steckt eben nur ein Tier.
Siehe Methode
Code:
public void add(int x, int y)
der Tierliste.

Wenn's um die Position geht ist es ja (zumindest im Moment) irrelevant, ob's ein Affe oder sonstiges Tier geht.

Ansonsten würde ich die Klasse Tier abstract machen, dann kann niemand so leicht ein Objekt Tier erzeugen.
 
Warum kann man ein Tier nicht in einen Affen casten (Affe erbt doch von Tier).

Mit [JAVA=10]t.add(10 ,10);[/code] erstelle ich ein neues Tier welches in das (erste) Listenelement gespeichert wird.

[JAVA=11]t.getKopf()[/code] gibt ja dann das Tier zurück welches im Listenelemnt drin ist.
 
Das Problem wenn ich die Klasse Tier abstract mache ist, dass ich dann keine TierListe mehr machen kann, weil man dann ja von Tier keine Objects erstellen kann!
 
Es soll im Endeffekt so aussehen:
Java:
TierListe tr = new TierListe();
tr.add(new Affe(10,10));
tr.add(new Nasenbaer(5,20));
DU entscheidest was zu deiner Liste hinzugefügt werden soll.
 
Danke schonmal, aber wie soll ich dann die add-Methode in der Tierliste verändern, denn der Konstruktor von Tier verlangt 2 int Parameter:

Java:
	public void add(Tier x) {
		if (kopf == null) {
			kopf = new Tier(); // Parameter ??
			next = new TierListe(); 
		} else
			next.add(x);
	}

so würde das ja nicht gehen

und wenn ich dann die Attribute x und y bei Tier rausmache funktioniert die Methode bewegen ja nicht mehr. Und eigentlich macht es ja Sinn diese Methode bei Tier zu haben weil sich alle Tiere bewegen können.

Edit: sorry Denkfehler das erste macht ja gar keinen Sinn

Das macht mehr Sinn:

Java:
	public void add(Tier x) {
		if (kopf == null) {
			kopf = x;
			next = new TierListe();
		} else
			next.add(x);
	}
 
Du musst ja auch kein Tier erstellen:
Java:
    public void add(Tier x) {
        if (kopf == null) {
            kopf = x;
            next = new TierListe(); 
        } else
            next.add(x);
    }
 
Ja hab ich auch bemerkt 😀

aaber wie soll ich denn jetzt die Position (x,y) übergeben, denn wenn ich das jetzt starte kommt da für posX = 0
posY = 0

raus aber da soll ja 10 und 10 rauskommen.

Main-Methode:

Java:
	public static void main(String[] args) {
		TierListe t = new TierListe();
		t.add(new Affe(10, 10));		

		System.out.println("X: " + t.getKopf().getX());
		System.out.println("Y: " + t.getKopf().getY());
	}

ist ja eigentlich auch klar weil Affe die positionen von Tier im Konstruktor übernimmt und die bei Tier halt 0 sind

Java:
	public Affe(int x, int y) {
		super(x, y);
	}
 

Zurück
Oben