java generics hashmap extends serializable

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