我有2个带<Integer, "sometype">
的HashMaps。所以“sometype”可能会有所不同,因此我试图使其成为通用的。在这种情况下,我的两个变量如下
private HashMap<Integer, UI_FieldPV> values_map = new HashMap<Integer, UI_FieldPV>();
private HashMap<Integer, JComponent> input_map = new HashMap<Integer, JComponent>();
该方法的第一次调用很好:
this.input_map = MapOperations.<JComponent> rearrengeHashMapIdx(this.input_map);
第二个调用使用<Integer, CustomClass>
this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.input_map);
这给了我以下错误:
<UI_FieldPV>rearrengeHashMapIdx(HashMap<Integer,UI_FieldPV>)
类型的参数化方法UI.MapOperations
不适用于参数(HashMap<Integer,JComponent>)
包含泛型方法的类的编码(顺便说一下:我试图在调用类中创建一个泛型方法但它没有用。我是否必须创建一个嵌入类才能使泛型方法参数工作?)< / p>
private static class MapOperations<T> {
public static <T> HashMap<Integer, T> rearrengeHashMapIdx(HashMap<Integer, T> source) {
HashMap<Integer, T> temp = new HashMap<Integer, T>();
for (Integer i = 0; i < 81; i++) {
Integer rowNum = (i / 3) % 3;
Integer block = i / 9;
Integer delta = (rowNum - block);
Integer newIdx = i + (delta * 6);
temp.put(i, source.get(newIdx));
}
return temp;
}
}
那么我做错了什么? 感谢您的帮助!
答案 0 :(得分:3)
编译器错误足够清楚。第一次调用方法:
this.input_map = MapOperations.<JComponent>rearrengeHashMapIdx(this.input_map);
将返回HashMap<Integer, JComponent>
,因为您已经给出了显式类型参数(嗯,这里不需要。类型T
无论如何都会从HashMap
的类型中推断出来你经过了)。这没关系,因为您已声明input_map
仅属于该类型。
然后您将input_map
作为参数传递给下一个方法调用:
this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.input_map);
现在,根据方法的声明,方法的参数应该是HashMap<Integer, T>
类型。在第二个方法调用中,类型参数T
被推断为UI_FieldPV
。因此,该方法需要HashMap<Integer, UI_FieldPV>
,但您传递的是HashMap<Integer, JComponent>
。当然,方法调用会失败,因为两个映射都不兼容。
也许,在第二次调用中,您打算将values_map
作为参数传递。所以这样可以正常工作:
this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.values_map);
请注意,方法中使用的类型参数T
与类声明使用的类型参数T
无关,尽管这在这里没有任何区别。但就是仅供参考。
答案 1 :(得分:0)
我不明白,¿你故意放了“input_map”?:
this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.input_map);
也许你需要这样的东西:
this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.values_map);