2016-09-18 61 views
0

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

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

有迹象表明,也基本上是相同的其他几个问题 - 提出的重复数据删除是一个那些我发现其答案中我认为是最好的。 –

+0

请勿使用原始类型。 – shmosel

回答

2

泛型是不变,地图的第二个类型参数是List<List<? extends Serializable>>,这意味着put第二个参数必须与此正好匹配

即只能添加一个List到地图,如果有确切的参数List<? extends Serializable>,并T是不准确? 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); 
}