编译器报告错误,因为您试图向地图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',但这就是你要强制的。 –