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