Java 无法将对象放入通用映射中
我声明了一个映射,其中包含Long类型的键到嵌套映射的映射 嵌套映射具有Class类型的键和SomeClient类型的值 基本上,我试图生成一个类类型到客户端的映射,该客户端生成类类型的响应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
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
vsLong
-您正在放置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>>>();