ObjektevonArray[] auf abgeleitetes Object[] casten

Anime-Otaku

Erfahrenes Mitglied
Hallo wie der Titel schon sagt möchte ich gerne ein Array von ObjektenA auf ein anderes ObjektenB Array casten. Das ObjektB ist abgeleitet von ObjektA und es ist in Wirklichkeit auch ObjektB.

Geht das ohne eine for Schleife?

Bisher bekamm ich mit einem:
Java:
public void method(ObjectA[] a){
ObjectB[] b=(ObjectB[]) a;
}

eine ClassCastException

P.S.: Ich muss Java 1.4 benutzen!
 
Zuletzt bearbeitet:
Anime-Otaku hat gesagt.:
Hallo wie der Titel schon sagt möchte ich gerne ein Array von ObjektenA auf ein anderes ObjektenB Array casten. Das ObjektB ist abgeleitet von ObjektA und es ist in Wirklichkeit auch ObjektB.

Also:
Java:
class ObjectA {
}

class ObjectB extends ObjectA {

}

Ist dass das wie dus modelliert hast?

Denn dann kann der folgende Code nicht funktionieren. ObjectB erweitert ObjectA. Daher kannst du zwar ein ObjectB auf ein ObjectA casten (denn in ObjectB sind alle Infos aus ObjectA enthalten, denn es wird ja nur erweitert), jedoch nicht ein ObjectA zu einem ObjectB casten, denn hier fehlen einfach Infos. Daher bekommst du auch eine ClassCastException.

Anime-Otaku hat gesagt.:
Java:
public void method(ObjectA[] a){
ObjectB[] b=(ObjectB[]) a;
}
 
Es ist nicht ganz so..:

Ich habe wie bereits gesagt ein ObjectA[] , welches in Wirklichkeit aber Objekte von Typ ObjectB enthält.

Also ein "ObjectA[0] instanceof ObjectB" würde true ergeben.
Aber ein Cast von ObjectA[] auf ObjectB[] würde nicht gehen.
 
Also hast du sowas:
Java:
public class ArrayCast {

	class ObjectA extends ObjectB {
		String s = "";

		public String toString() {
			return s;
		}
	}

	class ObjectB {	
	}

	public void test() {
		//Construct Array of type ObjectA
		ObjectA[] objectA = new ObjectA[10];
		for (int i = 0; i < objectA.length; i++) {
			ObjectA a = new ObjectA( );
			a.s = "objectA_" + i;
			objectA[i] = a;
		}

		//Convert array of type ObjectA to ObjectB
		ObjectB[] objectB = convert(objectA);

		//Test result of conversion
		for (int i = 0; i < objectB.length; i++) {
			System.out.println(objectB[i]);
		}

	}

	private ObjectB[] convert(ObjectA[] objectA) {
		ObjectB[] objectB = new ObjectB[objectA.length];
		objectB = objectA;

		return objectB;
	}

	public static void main(String[] args) {
		ArrayCast caster = new ArrayCast( );
		caster.test( );
	}
}

Das funktioniert aber wunderbar.
 
Hallo!

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

/**
 * @author Thomas.Darimont
 *
 */
public class ArrayCastExample {
    /**
     * @param args
     */
    public static void main(String[] args) {
        class A{
        }
        class B extends A{
        }
        
        //Das geht:
        A[] aa = new B[]{new B()};
        B[] bb = (B[])aa;
        
        //Das geht nicht:
        A[] a = new A[]{new A(),new B()};
        B[] b = (B[])a;
    }
}

Für die Lösung dieses Problems würde sich beispielsweise das Adapter Pattern anbieten:
http://help.eclipse.org/help30/inde.../api/org/eclipse/core/runtime/IAdaptable.html

Gruß Tom
 
Zurück