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;