Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

161
Visualizações
¿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 à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda