Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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:
public class Test<T> {
private T t;
public void setT(T t) {
this.t = t;
}
public T getT() {
return t;
}
public static void main(String[] args) {
Test<Integer> test = new Test<>();
test.setT(4);
Integer i = test.getT();
System.out.println(i);//4
}
}
wird:
Java:
public class Test {
private Object t;
public void setT(Object t) {
this.t = t;
}
public Object getT() {
return t;
}
public static void main(String[] args) {
Test test = new Test();
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:
public class Test<T> {
private T t;
public T[] getTArray(int size) {
return new T[size];
}
public static void main(String[] args) {
Test<Integer> test = new Test<>();
Integer[] integers = test.getTArray(2);
}
}
Der Compiler würde Folgendes draus machen:
Java:
public class Test {
private Object t;
public Object[] getTArray(int size) {
return new Object[size];
}
public static void main(String[] args) {
Test test = new Test<>();
Integer[] integers = (Integer[]) test.getTArray(2);//ClassCastExcepton
}
}
Du hättest jetzt eben ein Object Array welches nun genau das ist, kein Integer Array