Java 无法将对象放入通用映射中

Java 无法将对象放入通用映射中,java,generics,hashmap,extends,super,Java,Generics,Hashmap,Extends,Super,我声明了一个映射,其中包含Long类型的键到嵌套映射的映射 嵌套映射具有Class类型的键和SomeClient类型的值 基本上,我试图生成一个类类型到客户端的映射,该客户端生成类类型的响应 private static final Map<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>> someClientMap = n

我声明了一个映射,其中包含Long类型的键到嵌套映射的映射

嵌套映射具有Class类型的键和SomeClient类型的值 基本上,我试图生成一个类类型到客户端的映射,该客户端生成类类型的响应

private static final Map<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>> someClientMap 
       = new HashMap<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>>(); // <? super GenericResponse> should enable me to put subclasses of type GenericResponse in the Map

private static final Map您的代码中有几个问题。首先,如果要允许子类型,则应使用
extends
而不是
super

private static final Map<Long, Map<Class<? extends GenericResponse>, SomeClient<? extends GenericResponse>>> someClientMap 
       = new HashMap<Long, Map<Class<? extends GenericResponse>, SomeClient<? extends GenericResponse>>>();
如果您只是在初始声明中添加更多的
扩展
,以允许
SomeClient
的子类型,则可以保持
放置
不变:

private static final Map<Long, Map<? extends Class<? extends GenericResponse>, ? extends SomeClient<? extends GenericResponse>>> someClientMap
        = new HashMap<Long, Map<? extends Class<? extends GenericResponse>, ? extends SomeClient<? extends GenericResponse>>>();

该错误是由于Java泛型是不变的,即尽管
String
Object
的子类型,但以下代码行将无法编译:

Map<Long, Object> map = new HashMap<Long, String>();
Map Map=newhashmap();
因为
Map
不是
Map
的子类型

但是我们可以通过使用有界通配符来克服这个限制,即

Map Map=newhashmap();

这就是为什么有一个
类我发现了这个问题。在下面的声明中

someClientMap.put(clientId,  new HashMap<Class<T>,SomeClient<T>>());
someClientMap.put(clientId,newhashmap());
我正在创建的新HashMap比外部映射所接受的限制性更强。因为T扩展了泛型方法中的泛型响应

声明允许将GenericResponse类的不同子类存储在同一个映射中,因为我使用的是super

private static final Map<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>> someClientMap 
   = new HashMap<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>>(); // <? super GenericResponse> should enable me to put subclasses of type GenericResponse in the Map

private static final map看起来问题出在
Long
vs
Long
-您正在放置
Long
参数,map需要
Long
。添加casting或使用
Long.valueOf(.)
method您能否在问题中发布
SomeClient
genericsresponse
的声明?感谢您的回答,但我使用了super而不是extends,因为我想将GenericType类的不同子类添加到同一映射中。请参考此问题进行解释。@rohit.agrawal您是否阅读了该问题的答案?这很简单:如果您想允许GenericType的子类使用
?扩展GenericType
;如果要允许GenericType的超类,请使用
?super-GenericType
。我不想在映射中只允许GenericType的一个子类,我想在同一映射中允许多个子类型。复制链接中答案的某些部分以强调我所说的。如果列表在该列表示例中声明为
列表,如果您使用
列表,我的第一个建议是您应该使用的,因为我的
扩展
在映射中的类中,而不是在容器中,这在列表示例和我的第二个建议中都是如此。您使用
?超级GenericResponse
但是在文本中,您说您需要“保存
GenericResponse
类的不同子类的实例”-这很容易混淆,或者使用
?超级GenericResponse
并说“GenericResponse
类的超类”或使用
?扩展GenericResponse
并在使用时说“GenericResponse
类的子类”
someClientMap.put(clientId, new HashMap<Class<? extends GenericResponse>, SomeClient<? extends GenericResponse>>());
private static final Map<Long, Map<? extends Class<? extends GenericResponse>, ? extends SomeClient<? extends GenericResponse>>> someClientMap
        = new HashMap<Long, Map<? extends Class<? extends GenericResponse>, ? extends SomeClient<? extends GenericResponse>>>();
someClientMap.put(clientId, new HashMap<Class<T>, SomeClient<T>>());
return (SomeClient<T>) someClientMap.get(clientId).get(clazz);
Map<Long, Object> map = new HashMap<Long, String>();
Map<Long, ? extends Object> map = new HashMap<Long, String>();
Map<Long, Map<? extends Class<? extends GenericResponse>, ? extends SomeClient<? extends GenericResponse>>>
Map<Long, Map<Class<? extends GenericResponse>, SomeClient<? extends GenericResponse>>>
someClientMap.put(clientId,  new HashMap<Class<T>,SomeClient<T>>());
private static final Map<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>> someClientMap 
   = new HashMap<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>>(); // <? super GenericResponse> should enable me to put subclasses of type GenericResponse in the Map
someClientMap.put(clientId,  new HashMap<Class<? super GenericResponse>,SomeClient<? super GenericResponse>>());
 private static final Map<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>> someClientMap 
   = new HashMap<Long, Map<Class<? super GenericResponse>, SomeClient<? super GenericResponse>>>();