Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

153
Vistas
¿Qué regla de subtipo/supertipo en la especificación del lenguaje Java permite esta asignación?

Supongamos que tengo esta situación (artificial):

 public final Comparable<? super Number> frob() { return x -> 0; // whatever } final Comparable<? super Integer> c = frob();

El JLS define la capacidad de asignación de los tipos de referencia en términos de supertipos y subtipos solamente . Multa.

Uno de los supertipos directos de un tipo parametrizado es un tipo parametrizado equivalente con un tipo contenedor apropiado (una expresión comodín) en una de sus ranuras de argumento de tipo . Un tipo parametrizado con el mismo tipo sin formato y tipo de propietario y que contiene el argumento de tipo (entre otros) es, por lo tanto, un supertipo directo del tipo parametrizado original. (Entonces, según estas reglas, Comparable<?> es un supertipo directo de Comparable<Whatever> , al igual que Comparable<? extends Whatever> y Comparable<? super Whatever> , y muchos otros que se exponen en la sección 4.5.1).

La implicación de todo esto es, en términos generales, si tiene una referencia de "receptor" a que lleva el tipo A en su mano izquierda, y una referencia de "carga útil" b que lleva el tipo B en su mano derecha, entonces b es asignable a a si y solo si A es un supertipo (no solo directo) de B . Entonces, presumiblemente, lo que hace el compilador es calcular los supertipos de B y luego ver si la colección de tipos resultante contiene A

Sin embargo, debo estar equivocado en esta suposición, porque analizar los supertipos de Comparable<? super Number> por sí mismo siguiendo estas reglas aparentemente nunca producirá Comparable<? super Integer> . (Es decir, mirando solo los argumentos de tipo, si "comienza desde" Number y "sube" su jerarquía de supertipos para calcular los tipos que lo contienen, nunca "alcanzará" Integer , porque como todos sabemos, Integer es un subtipo de Number , no un supertipo de él.)

Entonces, en mi ejemplo anterior, ¿qué reglas en el JLS permiten Comparable<? super Integer> para ser derivado como un supertipo directo de Comparable<? super Number> ? ¿Se encuentra en la sección sobre inferencia de tipos , aunque a mi modo de ver no hay ninguna inferencia aquí (es decir, sin operador de diamante, sin var , etc.)?

Para que quede claro: mi problema no es con la asignación, que sé que en la práctica, por supuesto, está bien (si el método de ejemplo anterior devuelve una nueva clase anónima Comparable<Object> , por ejemplo, eso funcionaría). Es con mi entendimiento de cómo el JLS permite esto.

over 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda