0

我有 2 个带有<Integer, "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);

第二个调用传递一个 HashMap<Integer, CustomClass>

this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.input_map);

这给了我以下错误:

<UI_FieldPV>rearrengeHashMapIdx(HashMap<Integer,UI_FieldPV>)类型的参数化方法UI.MapOperations不适用于参数(HashMap<Integer,JComponent>)

包含泛型方法的类的编码(顺便说一句:我试图在调用类中创建一个泛型方法,但它没有工作。我是否必须创建一个嵌入式类才能使泛型方法参数工作?)

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

那么我做错了什么?提前感谢您的帮助!

4

2 回答 2

3

编译器错误很清楚。第一次调用方法:

this.input_map = MapOperations.<JComponent>rearrengeHashMapIdx(this.input_map);

将返回 a HashMap<Integer, JComponent>,因为您已经给出了显式类型参数(好吧,这里实际上并不需要。T无论如何,类型都会从HashMap您传递的类型中推断出来)。没关系,因为您已声明您input_map仅属于该类型。

然后您将input_map作为参数传递给下一个方法调用:

this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.input_map);

现在,根据方法的声明,方法的参数应该是 type HashMap<Integer, T>。在第二个方法调用中,类型参数T被推断为UI_FieldPV. 因此,该方法需要 a HashMap<Integer, UI_FieldPV>,但您传递的是 a HashMap<Integer, JComponent>。当然,方法调用会失败,因为两个映射都不兼容。

也许,在第二次调用中,您打算values_map作为参数传递。所以这可以正常工作:

this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.values_map);

请注意,T方法中使用的类型参数与类声明中使用的类型参数无关T,尽管在这里没有任何区别。但仅供参考。

于 2013-10-23T17:24:30.873 回答
0

我不明白,¿你故意放“input_map”?:

this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.input_map);

也许你需要类似的东西:

this.values_map = MapOperations.<UI_FieldPV>rearrengeHashMapIdx(this.values_map);
于 2013-10-23T17:29:12.020 回答