gpt4 book ai didi

Java 泛型 - 以泛型类型作为键的映射

转载 作者:行者123 更新时间:2023-11-30 09:13:38 25 4
gpt4 key购买 nike

我有以下 map 。两个映射都包含 ClassA/ClassB 的实例和 CellProcessor 的实例作为值(value)。

Map<ClassA, CellProcessor> classAProcessors;
Map<ClassB, CellProcessor> classBProcessors;

我想创建一个 map ,它将上面的 map 存储为值,并将键作为 ClassA/ClassB 的类类型这样当我做map.get(ClassA.class)它返回我Map<ClassA, CellProcessor> classAProcessors

我写了这个方法来创建最终 map ,但它似乎不起作用。

public static <T> Map<Class<T>, Map<T, CellProcessor>> getOutputProcessors(){
Map<ClassA, CellProcessor> classAProcessors = getOutputCellProcessorsForClassA();
Map<Class<T>, Map<T, CellProcessor>> processors = Maps.newLinkedHashMap();
processors.put(ClassA.class, classAProcessors ); //error here
return processors;
}

编译器错误:

The method put(Class<T>, Map<T,CellProcessor>) in the type Map<Class<T>,Map<T,CellProcessor>> is not applicable for the arguments (Class<ClassA>, Map<ClassA,CellProcessor>)

谁能帮我理解这里出了什么问题。

谢谢

最佳答案

编译器报错,因为你试图添加到 map 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);

但是这样 map processorsAprocessorsB不兼容,您将无法将它们合并到一张 map 中。所以你需要使用不同于 Map<Class<T>, Map<T, CellProcessor>> 的 map 类型.
最好的方法是为 ClassA 创建(如果已经存在则不创建)父类(super class)型和 ClassB (例如名称为 ClassBase 的类或接口(interface))。 getOutputProcessors使用父类(super class)的方法 ClassBase看起来如下:

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

如果由于某种原因你不能在你的代码父类(super class) 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;
}

希望我的回答对你有帮助

关于Java 泛型 - 以泛型类型作为键的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20961923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com