ich habe gerade ein Verständnisproblem bei der Lösung einer Uni-Aufgabe...
So richtig hat mir auch kein googeln geholfen, aber vielleicht bin ich auch nur betriebsblind...
Es soll an sich nur das Verhalten der Funktion toArray(Object[] a) einer Collection "imitiert" werden, der Rückgabetyp entspricht also dem Typen des übergebenden Objekts.
Kompilieren lässt sich das ganze, aber beim ausführen bekomme ich dann eine ClassCastException: [Ljava.lang.Object;
Irgendwie bin ich zwar der Sache auf der Spur, aber das "Aha"-Erlebnis kommt noch nicht.
Vielleicht kann mir mal jemand auf die Sprünge helfen??
Danke!
Code:
public <T> T[] toArray(T[] rei) {
Object[] tmp=new Object[mr.length];
// hier passiert halt was mit tmp...in diesem Fall einfach eine Kopie des Array mr in tmp.
// Auch kann ich kein Array vo Typ T[] erstellen und direkt damit arbeiten...
return((T[])tmp); // das casten in den generischen Typ T[] geht nicht...warum?
} // toArray
Hi,
vllt hilft es dir, die toArray(T[]) Methode einer schon implementieren Collection anzuschauen:
Code:
public <T> T[] toArray(T[] a) {
if (a.length < size)
a = (T[])java.lang.reflect.Array.
newInstance(a.getClass().getComponentType(), size);
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
Hier wird nämlich mit Reflection gearbeitet, aber auch gecastet, wobei das hier kein Problem ist. Wo bei dir jetzt der Fehler liegt, kann ich auch nicht sagen...
Hi Redfrettchen, super, die Implementierung geht so. Ich verstehe sie nur leider noch nicht so wirklich....und darum geht es hier. Aber ich bin dran
Mein Denkfehler war wohl, wie Roar schon schreibt, dass zwar jeder Typ in ein Object gecastet werden kann, aber nicht ein Object in jeden Typ. Das war wohl der Fehler. (Gar nicht so einfach, wenn man vom ollen Pascal kommt).
Jetzt habe ich noch nicht gerafft, warum ich kein neues T[] erstellen darf? Dann meckert er: "Generic Array"...
Aber ich bin wieder ein ganzes Stück weiter und es hat wieder viel länger gedauert, als gehofft. Habt vielen Dank!!!
Naja, es wird halt das K gegen den Laufzeittyp ersetzt, aber du kannst natürlich nicht new K() oder sowas aufrufen, genauso wie du nicht new K[5] schreiben kannst.
Code:
K[] asdf;
hingegen ist erlaubt, aber du kannst der Variable eben kein neues Objekt zuordnen.