我想实现一个使用泛型来强制键和值之间的类型关系的映射包装器。 以下代码无法编译:
Map<Class<? extends Serializable>, List<List<? extends Serializable>>> collection = new HashMap();
private <T extends Serializable> void add(Class<T> type, List<List<T>> item) {
collection.put(type, item);
}
而这个编译:
Map<Class<? extends Serializable>, List<? extends Serializable>> collection = new HashMap();
private <T extends Serializable> void add(Class<T> type, List<T> item) {
collection.put(type, item);
}
为什么第二级和第三级泛型类型之间存在差异?
答案 0 :(得分:2)
泛型是不变,地图的第二个类型参数是List<List<? extends Serializable>>
,这意味着put
的第二个参数必须与此完全匹配
即。只有List
具有确切参数List<? extends Serializable>
且T
<{em> ? extends Serializable
时才能向地图添加? extends
。
您可以通过在地图和方法声明中添加另一个Map<Class<? extends Serializable>, List<? extends List<? extends Serializable>>> collection = new HashMap<>();
private <T extends Serializable> void add(Class<T> type, List<? extends List<T>> item) {
collection.put(type, item);
}
来解决此问题:
AsyncTask