Collections Generics, internes Verhalten

123456789

Aktives Mitglied
Hallo ,

ich hätte eine Frage zu Java Generics.

Ich weiß das die Generics wegen der abwärts- Kompatibilität den Mechanismus des Type Erasure verwenden. Das heißt ja, dass zur Laufzeit keine Typinformation mehr bekannt sind und deshalb zur Kompilierzeit die Typsicherheit geprüft wird.

Und meine Frage dazu:
Wie werden dann die Werte z.B. in einer ArrayList<Integer> gespeichert? --> Als Object?

Und wenn ich folgende Liste habe:

Java:
List<Integer> intList = new ArrayList<Integer>();
intList.add(1);
Integer myInt = intList.get(0);

Zur Kompilierzeit weiß der Compiler ja dass die "intList" Integer werte beinhaltet und weiß deshalb auch, dass die Zeile 3 in Ordnung gehen muss.

Aber woher ist zur Laufzeit bekannt, dass der Wert aus intList.get(0) ein Integer ist, bzw. von Object auf Integer gecastet werden muss.

Und wie viele casts werden durch die Verwendung von Generics implizit durchgeführt?
Wie beeinflussen Generics (durch Casts) die Laufzeit?

Ich hab leider niergends eine Beschreibung dazu finden können. Meist wird nur das Type Erasure beschrieben, aber vom internen Verhalten nicht.

Wäre super wenn mir jemand weiterhelfen könnte, bzw. einen Link postet wo dieses interne Verhalten beschrieben ist.


Vielen Dank,
 

tuttle64

Bekanntes Mitglied
Hallo ,

ich hätte eine Frage zu Java Generics.

Ich weiß das die Generics wegen der abwärts- Kompatibilität den Mechanismus des Type Erasure verwenden. Das heißt ja, dass zur Laufzeit keine Typinformation mehr bekannt sind und deshalb zur Kompilierzeit die Typsicherheit geprüft wird.

Und meine Frage dazu:
Wie werden dann die Werte z.B. in einer ArrayList<Integer> gespeichert? --> Als Object?

Ja. Wenn Du keine Grösse angibst, legt die JVM zur Laufzeit ein Array von Object[10] an.

Wenn Du die Implementierung von get anschaust:

Code:
    public E get(int index) {
	RangeCheck(index);

	return (E) elementData[index];
    }

dann ist es so, dass zur Kompiliertzeit die E mit dem Typ den man in <E> angegeben hat ersetzt wird d.h. mit der get Methode erhält man ein Integer falls die Liste mit ArrayList<Integer> erzeugt worden ist.
 
Zuletzt bearbeitet:

Fu3L

Top Contributor
Zur Kompilierzeit weiß der Compiler ja dass die "intList" Integer werte beinhaltet und weiß deshalb auch, dass die Zeile 3 in Ordnung gehen muss.

Aber woher ist zur Laufzeit bekannt, dass der Wert aus intList.get(0) ein Integer ist, bzw. von Object auf Integer gecastet werden muss.

Und wie viele casts werden durch die Verwendung von Generics implizit durchgeführt?
Wie beeinflussen Generics (durch Casts) die Laufzeit?

Der Compiler baut
Java:
intList.add(1);
in sowas um:
Java:
intList.add(new Integer(1));
//oder Integer.valueOf(), zu faul zu gucken, wie mans macht^^

Dadurch wird für jeden primitiven hinzugefügten Wert ein neues Objekt erzeugt. Das beeinträchtigt bei wirklich großen Zahlen (mehrere tausend) durchaus die laufzeit.
Da empfielt sich gnu-trove (kannste nach Googlen), dort gibts sowas wie TIntList, TLongList, TIntIntHashMap und so weiter^^
 
S

SlaterB

Gast
dann ist es so, dass zur Kompiliertzeit die E mit dem Typ den man in <E> angegeben hat ersetzt wird d.h. mit der get Methode erhält man ein Integer falls die Liste mit ArrayList<Integer> erzeugt worden ist.
was soll das denn bedeuten? es wird doch nicht der Quelltext von ArrayList geändert, so dass dort Integer auftaucht,
die API wird überhaupt nicht neu kompliliert, auch schwer wenn ArrayList mehrfach mit verschiedenen generischen Parametern verwendet wird

123456789 hat es selber schon richtig geschrieben, in der kompilierten Klasse ArrayList ist alles zu Object geändert, die get-Methode liefert Object zurück und fertig, ist ihr ganz egal was da drin ist,
der Cast passiert beim Aufrufer, an sich ist ziemlich leicht zu erkennen wo er hingehört, wie oft usw.,
exakte Implementations-Details sind natürlich etwas schwerer zu nennen,

die Frage richtete sich ja auch vorausschauend auf Links, von mir leider keine
 

Marco13

Top Contributor
Nur nebenbei: Mit javap kann man sich den generierten bytecode einer Klasse ansehen. AFAIR wird dort gelegentlich öfter gecastet als notwendig, aber das hat auf die Laufzeit wohl keinen nennenswerten Einfluß.
 

Gregorrr

Bekanntes Mitglied
Nur nebenbei: Mit javap kann man sich den generierten bytecode einer Klasse ansehen. AFAIR wird dort gelegentlich öfter gecastet als notwendig, aber das hat auf die Laufzeit wohl keinen nennenswerten Einfluß.

Das hängt wohl mit der zu Grunde liegenden Datenstruktur zusammen. Ist sie ordentlich generisch programmiert, fällt jegliches Casten weg.
 

Gregorrr

Bekanntes Mitglied
Ich glaub hier liegen einige Verständnissfehler vor.

Generics sind ein statisches Mittel, dafür zu sorgen, dass der Typ zur Kompilierungszeit richtig und überall gesetzt ist. Würde man 100% generisch programmieren, könnte man komplett auf Casten verzichten, wodurch nicht mehr zur Laufzeit Castin-Exceptions auftreten würden und auch gar nicht gecastet werden müsste, ergo könnte sich das positiv auf die Laufzeit auswirken.

Ein anderes Problem hier, ist, dass int's per Autoboxing zu Integers gemacht werden. Das hat zunächst mal nichts mit Generics zu tun. Da allerdings Generics Objekte brauchen doch schon. Generell könnte ich mir vorstellen, dass Autoboxing und Unboxing so effizient implementiert sind, dass das eigentlich keinen merklichen Einfluss auf Performance haben sollte.
 

Fu3L

Top Contributor
Generell könnte ich mir vorstellen, dass Autoboxing und Unboxing so effizient implementiert sind, dass das eigentlich keinen merklichen Einfluss auf Performance haben sollte.

Hats.. Bei 20.000 Elementen kannst du das subjektiv deutlich wahrnehmen und nicht nur messen...

Würde man 100% generisch programmieren, könnte man komplett auf Casten verzichten,

Ja, das bestreitet Marco auch nicht. Aber im Bytecode muss gecastet werden, weil der Interpreter in den Listen nur Objekte sieht. Generics sind nämlich nur bis zur Kompilierzeit vorhanden.
 

123456789

Aktives Mitglied
Vielen Dank für all eure Antworten,

also es hat sich doch bestätigt, dass zur Laufzeit alle elemente generischer Listen usw. den Datentyp Object zu grunde liegen.

Bezüglich dem Casting, da muss ich mich entschuldigen, denn ich denke ich habe das unzureichend formuliert. Dazu ein kleines Bsp in pseudo code.
Würde ich meinen eigenen DataStorage (wenn auch nur für ein Element) erstellen (ohne Generics) dann würde ich, um alle Datentype unterstützen zu können eine Variable vom Typ Object benötigen.

Java:
class MyData{
   private Object data;
   private void setData(final Object data){ ...}
   private Object getData(){ ... }
}

Java:
class MyMusic{
   private String songName;
   ...
}

Dann könnte ich in MyData einen Musiktitel speichern.

Java:
class Main{
   public static void main(){
      MyData md = new MyData();
      md.setElem(new MyMusic());
      ...
      // Und ich kann den Musiktitel auch wieder abrufen, wobei aber explizit gecastet werden muss.
      // Und um genau diesen cast geht es.
      MyMusic myMusic = (MyMusic)md.getElem();

   }
}

Wenn ich einen generischen Ansatz wähle, dann würde myMusik zur Laufzeit auch als Object behandelt werden.

Aber woher ist zur Laufzeit bekannt, dass der Wert aus myMusic vom Typ MyMusic ist, bzw. von Object auf MyMusic gecastet werden muss? --> Alle Typinformationen sind ja zur Laufzeit gelöscht worden!

Danke für eure Hilfe,
 
S

SlaterB

Gast
eben weil Casts eingefügt werden, das ist doch ein einfaches Konzept

Java:
ArrayList<Integer> l = ..
Integer k = l.get(..)
wird ungefährt genau zu

Java:
ArrayList l = ..
Integer k = (Integer) l.get(..)
gehts darum?
der Kompiler streicht Generics, aber fügt gleichzeitig Casts hinzu
 

123456789

Aktives Mitglied
Vielen Dank SalterB,

ja, ich denk, das ist genau die Antwort die ich suche.
Anscheinened fange ich auch langsam an die Zusammenhänge von Generics zu verstehen :)
Der cast vom Kompiler kann problemlos hinzugefügt werden, da zur Kompiletime versichert wurde, dass die Liste nur zB. Integers beinhaltet. Und durch das Löschen der TypParameter sieht der, eigentlich generische Code, wieder gleich wie jener Code aus, bevor es Generics gegeben hat. Und deshalb wird die oftmals beschriebene Abwärtskompatibilität gewährleistet!

Ich glaub das war's :)

Vielen Dank !
 

Marco13

Top Contributor
Da dürfte der Hauptaspekt aber das Boxing sein, und nicht das Casten (dass Boxing nichts für wirklich große Mengen von "primitiven" Werten in zeitktischen Programmen ist, ist bekannt)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und instanceof Allgemeine Java-Themen 10
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
G Generics und Comparable Allgemeine Java-Themen 11
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4
G Generics: Instanzieren einer Klasse in einer Methode. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben