FeldCast?

flashray

Erfahrenes Mitglied
Hallo,

folgendes Szenario:

Java:
public class GeometrischeForm {}

Java:
public class Dreieck extends GeometrischeForm {}

Java:
public class ObjectCast {
	public static void main(String[] a) {
		GeometrischeForm f[] = new GeometrischeForm[3];
		f[0] = new Dreieck();
		f[1] = new Dreieck();
		f[2] = new Dreieck();
		System.out.println(f.length);
		Dreieck d[] = new Dreieck[3];
		d[0] = (Dreieck) f[0];
		d[1] = (Dreieck) f[1];
		d[2] = (Dreieck) f[2];
		System.out.println(d.length);
	}
}
Ausgabe
Code:
3
3

Java:
public class FeldCast {
	public static void main(String[] a) {
		GeometrischeForm f[] = new GeometrischeForm[3];
		f[0] = new Dreieck();
		f[1] = new Dreieck();
		f[2] = new Dreieck();
		Dreieck d[] = new Dreieck[3];
		System.out.println(f.length);
		d = (Dreieck[]) f;
		System.out.println(d.length);
	}
}
Ausgabe
Code:
3
Exception in thread "main" java.lang.ClassCastException: [Luebung3.GeometrischeForm;
	at uebung3.FeldCast.main(FeldCast.java:11)

Warum bei FeldCast diese Exception auftritt kann ich irgendwie schon nallvolziehen. Aber wie würde man dies Java-Fachspezifisch begründen?


Vg Erdal
 
Moin flash,

Meines Wissens klappt es nicht per FeldCast ein Objekt mal auf die Schnelle zu übergeben.
Realisier das Ganze doch einfach mit einer for-Schleife, die d[] die entsprechenden f[]-Objekte zufügt.

Gruss,
Xandro
 
Hallo!

Schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 *
 */
public class ArrayCastExample2 {

  /**
   * @param args
   */
  public static void main(String[] args) {
    A[] as = new A[2];
    as[0] = new B();
    as[0] = new C();
    
    B[] bs = (B[])as; // geht nicht... und zwar aus gutem Grund:
    //Wenn dieser Cast möglich wäre hättest du ein C das du versuchen würdest
    //wie ein B anzusprechen ...
    
  }
  
  static class A{}
  static class B extends A{}
  static class C extends A{}

}

Gruß Tom
 
Hallo,

@Xandro
Das ist eine Übungsaufgabe, bei welcher wir diese Exception begründen sollen, daher brauche ich hier keinen Workaround :).

@Tom
Stimmt!
Code:
d = (Dreieck[]) f;
Wenn das funktionieren würde, dann würde man Kreise, Vierecke, etc. aus f nach dem übergeben mit cast zu d alle als Dreiecke ansprechen, obwohl diese eventuell die Eigenschaften nicht aufweisen.

In der Klasse FeldCast ist es zwar so das alle Elemente von f wirklich Dreiecke sind. Da aber Felder nicht by value sondern by reference übergeben werden, könnte man später in f[0] bspw eine Referenz zu einem Kreis Objekt speichern, wodurch d[0] auch diese erhalten würde. Um dies vorzubeugen, kann man f nicht zu d casten.

Danke für die Hilfe an beide!


Vg Erdal
 
Zurück