Generischer Typ - Array

Javt

Aktives Mitglied
Hi,

Folgendes ist mit generischen Typen machbar:
Java:
private E[] data;
(wobei E die Typvariable ist)

Aber wieso geht nicht folgendes:
Java:
data = new E[maxSize]
?

lg
 
Das geht nicht mal ohne array... mit Array schon gar nicht, Generics und Arrays vertragen sich nicht.
 
In dem Moment, wo Du eine einzelne Variable oder einen Array initialisierst, brauchst Du den wirklichen Typen. Schreibe den generischen Code am besten in eine (abstract) Superklass und kümmere Dich im die Initialisierung in der Subklasse. Dort hast Du ja den konkreten Typen zu fassen.
 
wenn man sowas wie eine ArrayList baut, wohl der häufigere Fall, mindesten wenn man ein derartiges Array erstellt,
dann gibt es aber keine Subklassen,

intern einfach ein Object[] erzeugen, auf (E[]) casten
 
Und wieso geht das nicht:
Java:
MeineListe<? extends Number> liste = new MeineListe<? extends Number>(5);

Geht es deswegen nicht, weil die Klasse einen konkreten Datentypen haben will und mit "?" (einem allgemeinen Datentypen) nichts anfangen kann?
Wieso geht es dann auf der linken Seite?

lg
 
quasi aus demselben Grund oder naheliegend ohne Generics ein Beispiel:

List x = new ArrayList()

eine Variable kann vom Typ eines Interface sein, ein Interface kann man aber nicht erstellen,

'? extends Number' hat auch eine bestimmte Bedeutung, irgendeine Subklasse von Number, für einen Typ einer Variable ist das sinnvoll, für Erzeugung nicht
 
Noch eine Frage:
Java:
MeineListe<Integer> liste = new MeineListe<Integer>(5);
--> Die Klasse hat eine "addElement(E el)"-Methode und eine "addStringElement(String str)"-Methode. Nun kann ich obwohl die Liste vom Typ "Integer" ist auch einen String in die Liste einfügen. Nun das Problem:
1. Wenn ich ganz normal über "liste.elementAt(3)" auf das String-Element zugreife:
Java:
System.out.println(liste.elementAt(3))
tritt keine ClassCastException auf.
2. Wenn ich aber versuche über die Liste zu iterieren, tritt die "ClassCastException" auf:
Java:
for(Integer i : liste)
System.out.println(i);

Wieso tritt die Exception im ersten Fall nicht auch auf?
 
ist das nicht recht naheliegend?
in der unteren Variante gehen die Elemente zwischenzeitlich in Integer-Variablen, da ist ein String nicht gut,

in der oberen werden sie direkt weitergereicht, nirgendwo steht ein Typ,


gebaut sind Generics so, dass es sie zur Laufzeit weightend nicht mehr gibt,
alle Methoden liefern dann Object zurück bzw. es wird gecastet, aber nur wenn nötig,
die untere Methode erfordert den Cast für die Integer-Variable, der obige Code nicht
 
Java:
System.out.println(liste.elementAt(3))
Damit rufst Du implizit die toString()-Methode des elements auf. Jedes Objekt in Java hat diese Methode. Deswegen geht es immer.
Java:
for(Integer i : liste)
Hier sagst Du explizit, dass Du Integers aus der Liste holen willst. Da Du aber offensichtlich auch direkt Strings speicherst, führt das genau in dem Moment zu einer ClassCast-Exception, wo das aktuelle Element vom Typ String ist.

Der Witz an Generics ist, dass Du Typsicherheit zur Programmierzeit herstellst. Wenn Du die selbst aufweichst, kann Dir auch Generics nicht helfen. Generics ist kein Mittel, um Javas Typsystem auszuhebeln und in Java so programmieren zu können wie in ungetypten Sprachen wie PHP oder JavaScript.
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben