編譯器報告錯誤,因爲您試圖向地圖processors
添加不兼容類型的條目。在編譯時編譯器不知道T
的類型是什麼。類型T
將由使用方法getOutputProcessors
的客戶端確定。方法processors.put
預計,第一參數是準確的Class<T>
類型(T
將僅由使用該方法getOutputProcessors
代碼來確定),但你總是傳遞的ClassA.class
相同的值。方法processors.put
的第二個參數也是不正確的,它應該是Map<T, CellProcessor>
的類型,並且您正在傳入類型爲Map<ClassA, CellProcessor>
的永久參數。將T
作爲獨立類型處理,因此在您的方法代碼中T
不等於ClassA
。你的方法正確版本應該是這樣的:
public static <T> Map<Class<T>, Map<T, CellProcessor>> getOutputProcessors(Class<T> key, Map<T, CellProcessor> classProcessors) {
Map<Class<T>, Map<T, CellProcessor>> processors = new HashMap<Class<T>, Map<T, CellProcessor>>();
processors.put(key, classProcessors);
return processors;
}
您可以通過以下方式使用此方法:
Map<Class<ClassA>, Map<ClassA, CellProcessor>> processorsA = getOutputProcessors(ClassA.class, classAProcessors);
Map<Class<ClassB>, Map<ClassB, CellProcessor>> processorsB = getOutputProcessors(ClassB.class, classBProcessors);
但這種方式在地圖processorsA
和processorsB
是不兼容的,你會不能將它們合併成一張地圖。所以你需要使用不同於Map<Class<T>, Map<T, CellProcessor>>
的地圖類型。
最好的方法是爲ClassA
和ClassB
(例如名稱爲ClassBase
的類或接口)創建(或者如果它已存在)超類型。使用超ClassBase
getOutputProcessors
方法如下所示:
public static Map<Class<? extends ClassBase>, Map<? extends ClassBase, CellProcessor>> getOutputProcessors() {
Map<Class<? extends ClassBase>, Map<? extends ClassBase, CellProcessor>> processors =
new HashMap<Class<? extends ClassBase>, Map<? extends ClassBase, CellProcessor>>();
processors.put(ClassA.class, getOutputCellProcessorsForClassA());
processors.put(ClassB.class, getOutputCellProcessorsForClassB());
return processors;
}
如果由於某種原因,你不能在你的代碼的超ClassBase那麼你可以使用看起來的方法如下:
public static Map<Class<? extends Object>, Map<? extends Object, CellProcessor>> getOutputProcessors3() {
Map<Class<? extends Object>, Map<? extends Object, CellProcessor>> processors =
new HashMap<Class<? extends Object>, Map<? extends Object, CellProcessor>>();
processors.put(ClassA.class, getOutputCellProcessorsForClassA());
processors.put(ClassB.class, getOutputCellProcessorsForClassB());
return processors;
}
希望我的答案將幫助你
什麼不工作,確切地說?你是否收到錯誤,或者是意外的行爲? –
添加了編譯器錯誤消息 – RandomQuestion
'T'不一定是'ClassA',但這就是你要強制的。 –