Pregunta de entrevista para Desarrollador Java

¿Qué es el borrado de tipos, y qué no puedes hacer por su culpa?

Qué evalúa el entrevistador, cómo estructurar tu respuesta y un ejemplo hablado que puedes adaptar.

Respuesta rápida

La información de tipos genéricos existe en tiempo de compilación y se borra en el bytecode, donde una List de String es solo una List con casts insertados por el compilador. Así que no puedes hacer instanceof contra un tipo parametrizado, ni crear un array de un parámetro de tipo, ni sobrecargar dos métodos que solo difieran en el argumento genérico. El compilador añade métodos puente para que el polimorfismo siga funcionando, y los casts sin comprobar pueden causar contaminación del heap.

Por qué lo preguntan los entrevistadores

Explica toda una familia de errores de compilación confusos, así que el entrevistador quiere ver que entiendes el mecanismo en vez de esquivarlo a base de intuición. Mencionar los comodines acotados y la regla de productor extends y consumidor super muestra que sabes diseñar una API genérica, no solo consumirla. También aparece siempre que alguien necesita el tipo real en ejecución, por ejemplo en un deserializador.

Cómo estructurar tu respuesta

  • Define el borrado y qué contiene realmente el bytecode.
  • Enumera las restricciones concretas que provoca.
  • Explica la regla de los comodines para firmas flexibles.
  • Di cómo recuperas la información de tipo en ejecución cuando no queda otra.

Ejemplo de respuesta

Ejemplo hablado, en primera persona

Los genéricos son una función de tiempo de compilación. Tras compilar, una List de String es solo una List, con el compilador habiendo insertado los casts, que es lo que mantuvo los genéricos compatibles hacia atrás. Las consecuencias visibles son que no puedo preguntar si algo es instancia de un tipo parametrizado, no puedo instanciar un array de un parámetro de tipo sin un cast sin comprobar, y no puedo sobrecargar un método con dos argumentos genéricos distintos porque ambos borran a la misma firma. Por eso también importa un aviso de cast sin comprobar: una lista mal tipada puede contener el elemento equivocado y fallar más tarde en algún cast no relacionado, que es contaminación del heap y resulta genuinamente molesta de rastrear. Cuando diseño una API uso comodines acotados para que sea usable, siguiendo la regla de productor extends y consumidor super, así que un método que lee de una colección toma un comodín que extiende el tipo. Cuando de verdad necesito el tipo en ejecución, por ejemplo para decirle a una librería JSON en qué deserializar, paso un objeto Class o uso una referencia de tipo que captura el parámetro mediante una subclase anónima, ya que el argumento de tipo de una clase sí se conserva en la firma.

¿Tienes esta entrevista a la vuelta de la esquina? GhostPilot escucha tu llamada en vivo, detecta la pregunta en cuanto la hacen y pone una respuesta estructurada en tu pantalla en tiempo real. Pruébalo en tu próxima entrevista de práctica, o coge un Session Pass de $29, sin suscripción, para la de verdad.

Mira cómo funciona

Preguntas de seguimiento que puedes esperar

  • ¿Qué significa en la práctica la regla de productor extends y consumidor super?
  • ¿Por qué genera el compilador métodos puente?
  • ¿Cómo captura una referencia de tipo un tipo genérico pese al borrado?

Más preguntas para Desarrollador Java

Tu entrevistador hará su propia versión de esta. Pega la descripción real del puesto en el Question Predictor gratuito y obtén las 20 preguntas que ese puesto tiene más probabilidades de hacerte, con lo que cada una busca en realidad.

Predecir mis preguntas

Ensaya las preguntas difíciles antes de que te las hagan

Practica con un copiloto en vivo y entra preparado. Un Session Pass de $29 te lleva a través de la entrevista sin suscripción y sin ataduras.

Consigue GhostPilot