Warum kann man Arrays nicht casten?
-
Warum gibt mir das eine java.lang.ClassCastException?
public static void main(String[] args) { Object[] objects = new Object[2]; objects[0] = "Hallo"; objects[1] = "Welt"; try { String[] strings = (String[]) objects; } catch (Exception e) { e.printStackTrace(); } }
-
Ums mit einer Analogie zu sagen: Eine Plastiktüte in der Kartoffeln eingepackt sind ist kein Kartoffelsack, auch wenn Kartoffeln drin sind.
Wäre dein Cast erlaubt, könnten böse Dinge geschehen:
Object[] array = new Object[2]; array[0] = "String"; array[1] = new Socket( "www.haba.org", 1234 ); String[] casted = (String[])array; String kabuuum = casted[1]; // moment, ein Socket in einem Stringarray?
Ganz anders würde es aussehen, wenn das am Anfang des Codes steht:
Object[] array = new String[2]; ...
-
Und wie kann ichs dann casten, wenn ich weiß, dass es die richtigen objecte sind?
-
Garnicht.
a) nur weil du was weisst, weiss der Compiler das nicht
b) ein Cast verändert nicht den Typ des referenzierten Objektes. Wenn der Typ "Object[]" ist, dann kannst du das nicht ändern.Mach eine Schleife und kopier das Zeugs selbst
Mach gleich zu Beginn ein "String[]", und lass den Cast weg. Casts zeugen in 99% aller Fälle von schlechtem Design, und sollten vermieden werden.
-
List list = new LinkedList(); list.add("Hallo"); list.add("Welt"); try { String[] strings = (String[]) list.toArray(); } catch (Exception e) { e.printStackTrace(); }
Dann ist die toArray Methode wohl schlechtes Javadesign?
-
Probiers aus... dein Code wird nicht funktionieren, da kommt eine Instanz des Types Object[] zurück...
Um sowas zu realisieren muss man: Selbst einen Array mit dem richtigen Typ herstellen, und diesen Array der Liste übergeben.
Mit den Generics von Java 1.5 sieht das dann so aus:List<String> list = new LinkedList<String>(); list.add( ... ); String[] array = list.toArray( new String[ list.size() ] );
Ohne einen einzigen Cast
-
ich frag mich wieso das überhaupt so umständlich nötig ist.
Wieso nicht einfachList<String> list = new LinkedList<String>(); String[] array = list.toArray();
-
JBeni schrieb:
Probiers aus... dein Code wird nicht funktionieren, da kommt eine Instanz des Types Object[] zurück...
Ach, ne
Und wenn ich nur 1.42 benutz, dann ... ?
-
JavaProgger schrieb:
JBeni schrieb:
Probiers aus... dein Code wird nicht funktionieren, da kommt eine Instanz des Types Object[] zurück...
Ach, ne
Und wenn ich nur 1.42 benutz, dann ... ?
Dann solltest Du langsam mal auf ein neueres Java umsteigen.
-
DEvent schrieb:
ich frag mich wieso das überhaupt so umständlich nötig ist.
Wieso nicht einfachList<String> list = new LinkedList<String>(); String[] array = list.toArray();
Das hat mit der Realisierung der Generics in Java zu tun. Man hat da sehr darauf geachtet, möglichst wenig Änderungen am Bytecode und an der JVM machen zu müssen. Deshalb überleben die konkreten Typparameter nicht bis in den Bytecode. (Technisch gesehen vielleicht nicht gerade die optimalste Lösung, aber es existiert nunmal ein riesiger Markt Rund um Java, so dass man da nicht einfach von heute auf morgen alles komplett ändern kann.)
Zumindest weiß die LinkedList zur Laufzeit nicht, von welchem Typ sie genau ist. Das kann sie nur über Reflection herausfinden und dafür braucht man zur Laufzeit etwas, aus dem der Typ hervorgeht. Die Elemente in der Liste können das nicht sein, da die Liste leer sein könnte oder auch nur Elemente eines abgeleiteten Typs beinhalten könnte. Deswegen muss man der entsprechenden Methode eben ein Array des jeweiligen Typs übergeben, das dann entweder genutzt wird, um die Elemente darin zu speichern oder um ein neues Array der gewünschten Größe zu erzeugen, in dem dann gespeichert wird.