Type Erasure und Raw Types
Type Erasure: Typparameter werden zur Laufzeit entfernt oder durch Bounds ersetzt. Deshalb sind new T() und Arrays von T problematisch.
Raw Types (List ohne <...>) existieren für Altcode. Der Compiler warnt; man verliert die Typprüfung.
In neuem Code Raw Types vermeiden und mit parametrisierten Typen arbeiten.
Löschung der Typparameter: JLS 4.6 [1].
$$\mathrm{erase}(\mathtt{List\lt E\gt })=\mathtt{List}$$
Wo gebraucht
Erklärt ClassCastExceptions zur Laufzeit, warum new T() fehlt und warum Reflection/Serialisierung Generics verliert. Raw Types in Altcode sind Migrationsschuld, keine moderne API-Form.
Vertiefung
Java übersetzt die meisten generischen Typinformationen in Prüfungen und Umwandlungen zur Compilezeit. Zur Laufzeit besitzen verschiedene Typargument-Ausprägungen meist dieselbe Klassenrepräsentation. Diese Übersetzung heisst Typlöschung.
Brückenmethoden erhalten Polymorphie, wenn spezialisierte Methodensignaturen nach der Übersetzung nicht mehr direkt übereinstimmen. Laufzeitinformationen über verschachtelte Typargumente sind nur eingeschränkt über Reflection verfügbar.
Ein Raw Type umgeht einen Teil der statischen Prüfung zur Kompatibilität mit älterem Code. Der unsichere Schreibzugriff und der spätere Cast können weit auseinanderliegen, wodurch Fehler an einer irreführenden Stelle auftreten.
Schwierigkeitsstufen
- Compilezeit- und Laufzeittypinformation unterscheiden.
- Den Zweck synthetischer Brückenmethoden erklären.
- Eine Raw-Type-Warnung bis zum späteren Fehler verfolgen.
Fallstricke
instanceof List<String> ist wegen fehlender vollständiger Laufzeitinformation nicht zulässig. Unterdrückte Warnungen sind kein Beweis für Typsicherheit.
Sources
Tasks
Card Info
- Topic: Algorithmen und Datenstrukturen
- Difficulty: Intermediate
- Completed: 0 users