Hi Leute und zwar versuche ich mich gerade an Generics im Rahmen meines OCPS und wollte mal fragen, warum das hier genau einen Fehler gibt und vor allem, wie ich das vermeide. Mir ist wichtig, warum es nicht geht, also wäre es nett, wenn ihr mir vielleicht auch noch ein wenig Hintergrund Wissen vermittelt .
dankeschön
Also generics und arrays beißen sich, d. h. hier dass Du kein generisches Array erstellen kannst. Die Typinformationen verschwinden zur Laufzeit, werden für die Array-Erstellung allerdings benötigt...
Das Problem ist das Genericss eigentlich nur zur compile time existieren.
Der Compiler löscht jedes <T> und ersetzt jedes T mit Object(Type Erasure). Und fügt bei zuweisung zu dem entsprechendne Typ den cast hinzu
Aus:
Java:
publicclassTest<T>{privateT t;publicvoidsetT(T t){this.t = t;}publicTgetT(){return t;}publicstaticvoidmain(String[] args){Test<Integer> test =newTest<>();
test.setT(4);Integer i = test.getT();System.out.println(i);//4}}
wird:
Java:
publicclassTest{privateObject t;publicvoidsetT(Object t){this.t = t;}publicObjectgetT(){return t;}publicstaticvoidmain(String[] args){Test test =newTest();
test.setT(4);Integer i =(Integer) test.getT();System.out.println(test.getT());}}
Jetzt überleg mal was passieren würde wenn folgender Code erlaubt wäre:
Java:
publicclassTest<T>{privateT t;publicT[]getTArray(int size){returnnewT[size];}publicstaticvoidmain(String[] args){Test<Integer> test =newTest<>();Integer[] integers = test.getTArray(2);}}
Der Compiler würde Folgendes draus machen:
Java:
publicclassTest{privateObject t;publicObject[]getTArray(int size){returnnewObject[size];}publicstaticvoidmain(String[] args){Test test =newTest<>();Integer[] integers =(Integer[]) test.getTArray(2);//ClassCastExcepton}}
Du hättest jetzt eben ein Object Array welches nun genau das ist, kein Integer Array