Question d'entretien pour Développeur Java

Qu'est-ce que l'effacement de type, et qu'est-ce qu'il vous empêche de faire ?

Ce que le recruteur cherche à évaluer, comment structurer votre réponse et un exemple parlé à adapter.

Réponse rapide

L'information de type générique existe à la compilation et est effacée dans le bytecode, où une List de String n'est qu'une List avec des casts insérés par le compilateur. Vous ne pouvez donc pas faire un instanceof sur un type paramétré, créer un tableau d'un paramètre de type, ni surcharger deux méthodes qui ne diffèrent que par leur argument générique. Le compilateur ajoute des méthodes pont pour que le polymorphisme continue de fonctionner, et les casts non vérifiés peuvent provoquer une pollution du tas.

Pourquoi les recruteurs posent cette question

Cela explique toute une famille d'erreurs de compilation déroutantes, donc le recruteur veut voir que vous comprenez le mécanisme plutôt que de le contourner au feeling. Mentionner les jokers bornés et la règle producteur extends, consommateur super montre que vous savez concevoir une API générique, pas seulement en consommer une. Le sujet revient dès que quelqu'un a besoin du type réel à l'exécution, par exemple dans un désérialiseur.

Comment structurer votre réponse

  • Définissez l'effacement et ce que le bytecode contient réellement.
  • Listez les restrictions concrètes qu'il entraîne.
  • Expliquez la règle des jokers pour des signatures souples.
  • Dites comment vous récupérez l'information de type à l'exécution quand il le faut.

Exemple de réponse

Exemple parlé, à la première personne

Les génériques sont une fonctionnalité de compilation. Après compilation, une List de String n'est qu'une List, le compilateur ayant inséré les casts, et c'est ce qui a gardé les génériques rétrocompatibles. Les conséquences visibles : je ne peux pas demander si quelque chose est une instance d'un type paramétré, je ne peux pas instancier un tableau d'un paramètre de type sans cast non vérifié, et je ne peux pas surcharger une méthode sur deux arguments génériques différents parce que les deux s'effacent vers la même signature. C'est aussi pour ça qu'un avertissement de cast non vérifié compte : une liste mal typée peut contenir le mauvais élément et échouer plus tard sur un cast sans rapport, ce qui est la pollution du tas et qui est franchement pénible à tracer. Quand je conçois une API, j'utilise des jokers bornés pour la rendre utilisable, en suivant la règle producteur extends, consommateur super, donc une méthode qui lit dans une collection prend un joker qui étend le type. Quand j'ai vraiment besoin du type à l'exécution, par exemple pour dire à une bibliothèque JSON vers quoi désérialiser, je passe un objet Class ou j'utilise une référence de type qui capture le paramètre via une sous-classe anonyme, puisque l'argument de type d'une classe est conservé dans la signature.

Vous passez cet entretien bientôt ? GhostPilot écoute votre appel en direct, repère la question dès qu'elle est posée et affiche une réponse structurée à l'écran en temps réel. Essayez-le lors de votre prochain entretien blanc, ou prenez un Session Pass à $29, sans abonnement, pour le jour J.

Voir comment ça marche

Questions de relance à prévoir

  • Que signifie la règle producteur extends, consommateur super en pratique ?
  • Pourquoi le compilateur génère-t-il des méthodes pont ?
  • Comment une référence de type capture-t-elle un type générique malgré l'effacement ?

Autres questions pour Développeur Java

Votre recruteur posera sa propre version de celle-ci. Collez votre véritable fiche de poste dans le Question Predictor gratuit et obtenez les 20 questions que ce poste a le plus de chances de poser, avec ce que chacune cherche vraiment à sonder.

Prédire mes questions

Répétez les questions difficiles avant qu'on vous les pose

Entraînez-vous avec un copilote en direct, puis présentez-vous prêt. Un Session Pass à $29 vous accompagne pendant l'entretien, sans abonnement et sans engagement.

Obtenir GhostPilot