2016-09-18 82 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); 
}