Generische Typinformation existiert zur Compile-Zeit und wird im Bytecode gelöscht, dort ist eine List of String nur eine List mit vom Compiler eingefügten Casts. Du kannst also kein instanceof gegen einen parametrisierten Typ prüfen, kein Array eines Typparameters erzeugen und keine zwei Methoden überladen, die sich nur im generischen Argument unterscheiden. Der Compiler fügt Bridge-Methoden ein, damit Polymorphie weiter funktioniert, und ungeprüfte Casts können Heap Pollution verursachen.
Warum Interviewer das fragen
Es erklärt eine ganze Familie verwirrender Compiler-Fehler, der Interviewer will also sehen, dass du den Mechanismus verstehst, statt dich gefühlsmäßig drumherum zu hangeln. Bounded Wildcards und die Regel Producer extends, Consumer super zu erwähnen zeigt, dass du eine generische API entwerfen kannst und nicht nur benutzen. Es kommt außerdem immer dann hoch, wenn jemand den echten Typ zur Laufzeit braucht, etwa in einem Deserializer.
So baust du deine Antwort auf
- Definiere Erasure und was im Bytecode tatsächlich steht.
- Zähl die konkreten Einschränkungen auf, die daraus folgen.
- Erklär die Wildcard-Regel für flexible Signaturen.
- Sag, wie du Typinformation zur Laufzeit rettest, wenn es sein muss.
Beispielantwort
Generics sind ein Compile-Zeit-Feature. Nach dem Compilieren ist eine List of String nur noch eine List, mit vom Compiler eingefügten Casts, und genau das hat Generics abwärtskompatibel gehalten. Die sichtbaren Konsequenzen: ich kann nicht fragen, ob etwas eine Instanz eines parametrisierten Typs ist, ich kann kein Array eines Typparameters ohne ungeprüften Cast instanziieren, und ich kann eine Methode nicht auf zwei verschiedene generische Argumente überladen, weil beide zur selben Signatur erodieren. Deshalb ist auch eine Unchecked-Cast-Warnung ernst zu nehmen: eine falsch typisierte Liste kann das falsche Element halten und später an irgendeinem unbeteiligten Cast scheitern, das ist Heap Pollution und wirklich lästig aufzuspüren. Wenn ich eine API entwerfe, nutze ich Bounded Wildcards, damit sie benutzbar ist, nach der Regel Producer extends, Consumer super, eine Methode, die aus einer Collection liest, nimmt also einen Wildcard, der den Typ erweitert. Brauche ich den Typ wirklich zur Laufzeit, etwa um einer JSON-Bibliothek zu sagen, wohin sie deserialisieren soll, übergebe ich ein Class-Objekt oder nutze eine Type Reference, die den Parameter über eine anonyme Unterklasse einfängt, denn das Typargument einer Klasse bleibt in der Signatur erhalten.
Steht dieses Vorstellungsgespräch bald an? GhostPilot hört bei deinem Live-Call mit, erkennt die Frage in dem Moment, in dem sie gestellt wird, und bringt dir eine strukturierte Antwort in Echtzeit auf den Bildschirm. Probier es im nächsten Mock aus, oder hol dir einen $29 Session Pass, kein Abo, für den Ernstfall.
So funktioniert esNachfragen, mit denen du rechnen solltest
- Was bedeutet die Regel Producer extends, Consumer super in der Praxis?
- Warum generiert der Compiler Bridge-Methoden?
- Wie fängt eine Type Reference einen generischen Typ trotz Erasure ein?
Weitere Fragen für Java-Entwickler
Dein Interviewer stellt seine eigene Version davon. Kopier deine echte Stellenbeschreibung in den kostenlosen Question Predictor und bekomm die 20 Fragen, die diese Rolle am wahrscheinlichsten stellt, samt dem, worauf jede wirklich abzielt.
Meine Fragen vorhersagen