java - Problema con la declaración de Map<String, Class<? extiende Serializable>>
generics hashmap (2)
Map<String,? extends Serializable> map1 = new HashMap<String,String>();
map1
contiene un V
ilimitado que solo requiere un desconocido de Serializable
. Por lo tanto, no puede encontrar un objeto genérico para vincular esto a, excepto null
.
Map<String,GenericClass<? extends Serializable>> map2 = new HashMap<String, GenericClass<String>>();
El map2
está delimitado por un tipo K
(en este caso String
) y V
( Class<? exends Serializable
). Así es como el compilador de Java ve los límites.
map1
, no se puede put
nada en el map1
excepto un nulo, ya que solo se verá map1.put(String key, null value) //Compiler is asking WTF here
. Mientras que, map2
hará, esencialmente "renderizar" como map2.put(String key, Class<? extends Serializable> value); //Much better...
map2.put(String key, Class<? extends Serializable> value); //Much better...
Debido al V
enlazado en map2
, la firma debe ser la misma en su declaración.
Java me proporciona por <? extends class>
<? extends class>
una forma de filtrar las clases java que puede usar para compilar en este caso el nuevo HashMap, por ejemplo:
Yo puedo hacer eso:
Map<String,? extends Serializable> map1 = new HashMap<String,String>();
Es correcto, porque String implementa Serializable, por lo que el compilador me permite hacerlo.
Pero cuando intento hacerlo:
Map<String,GenericClass<? extends Serializable>> map2 = new HashMap<String, GenericClass<String>>();
Siendo la GenericClass como esta:
public class GenericClass<T>
{
.
.
.
}
El compilador arroja un error que dice:
Type mismatch: cannot convert from HashMap<String,GenericClass<String>> to Map<String,GenericClass<? extends Serializable>>
Me gustaría saber, ¿qué es lo que sucede?
Tal vez el compilador no puede detectar que la clase extends forma parte de un tipo genérico.
Debería usar lo siguiente:
Map<String, ? extends GenericClass<? extends Serializable>> map2 =
new HashMap<String, GenericClass<String>>();
Los comodines anidados son muy diferentes de los comodines de alto nivel; solo los últimos realizan capturas de comodines . Como resultado, HashMap<String, GenericClass<String>>
se considera inconvertible para Map<String, GenericClass<? extends Serializable>>
Map<String, GenericClass<? extends Serializable>>
, porque GenericClass<? extends Serializable>
GenericClass<? extends Serializable>
es un argumento de tipo concreto (y porque los genéricos no son covariantes ).
Consulte esta publicación para obtener más información sobre comodines anidados: Múltiples comodines en un método genérico hace que el compilador de Java (¡y yo!) Sea muy confuso