tutorial que interfaz grafica español ejemplos componentes java generics type-conversion extends bounded-wildcard

que - java swing tutorial pdf español



¿Por qué no se puede asignar I<? extiende Tipo> a<Tipo>? (2)

Las siguientes declaraciones:

URLClassLoader ucl = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class<URLClassLoader> uclc = ucl.getClass();

falla con error:

Type mismatch: cannot convert from Class<capture#2-of ? extends URLClassLoader> to Class<URLClassLoader>

¿Por qué necesito un elenco, aquí?

Encontré varias publicaciones explicando por qué no puedes hacer lo contrario (asignar T a a), pero eso es (algo así) obvio y entendido.

NOTA: Estoy codificando esto bajo el eclipse Luna, así que no sé si es Luna Quirk o si hay algo que realmente no entiendo en los genéricos.


Covarianza vs contravariancia vs invariancia

  • Class<? extends URLClassLoader> Class<? extends URLClassLoader> es invariante .

Como resultado,

Class<? extends URLClassLoader> Class<? extends URLClassLoader> no es un subtipo de Class<URLClassLoader>

En Java, una variable puede contener una referencia de una instancia del mismo tipo o subtipo .

Por lo tanto,

Class<URLClassLoader> uclc = ucl.getClass();

es inválido

Por otra parte,

Class<? extends URLClassLoader> uclc = ucl.getClass();

sería válido


¿Por qué no se puede asignar I <? extiende Tipo> a <Tipo>?

Porque en realidad <? extends Type> <? extends Type> es un supertipo de <Type> ! Sigamos las especificaciones

4.10.2 Subtipo entre tipos de clase e interfaz :

Dada una declaración de tipo genérico C <F 1 , ..., F n >, los supertipos directos del tipo parametrizado C <T 1 , ..., T n > son todos los siguientes:

  • C <S 1 , ..., S n >, donde S i contiene T i .

4.5.1. Escriba argumentos de tipos parametrizados :

Se dice que un argumento de tipo T 1 contiene otro argumento de tipo T 2 , escrito T 2 <= T 1 , si el conjunto de tipos denotados por T 2 es probablemente un subconjunto del conjunto de tipos denotados por T 1 bajo el modo reflexivo y transitivo cierre de las siguientes reglas:

  • T <=? se extiende T

Por lo tanto, ¿sabemos eso ? extends URLClassLoader ? extends URLClassLoader contiene URLClassLoader , Class<? extends URLClassLoader> Class<? extends URLClassLoader> es un supertipo de Class<URLClassLoader> .

Debido a que no se permite una conversión de referencia de estrechamiento dentro de un contexto de asignación , se produce un error de compilación.

También tenga en cuenta que esto significa que la asignación inversa está permitida:

Class<URLClassLoader> concrete = URLClassLoader.class; Class<? extends URLClassLoader> wildcard = concrete;