通用映射不使用嵌套结构进行编译

时间:2016-09-18 19:58:39

标签: java generics

我想实现一个使用泛型来强制键和值之间的类型关系的映射包装器。 以下代码无法编译:

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);
}

为什么第二级和第三级泛型类型之间存在差异?

1 个答案:

答案 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