2013-10-23 94 views
0

我有2個HashMaps與<Integer, "sometype">。所以「某種類型」可能會有所不同,因此我試圖使其具有通用性。在這種情況下,我的兩個varaibles如下Java泛型:調用通用方法「...不適用於參數...」

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

一個HashMap,給了我出現以下錯誤:

The parameterized method <UI_FieldPV>rearrengeHashMapIdx(HashMap<Integer,UI_FieldPV>) of type UI.MapOperations is not applicable for the arguments (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; 
    } 
} 

那麼我在做什麼錯? 感謝您的幫助!

+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,雖然這並不在這裏做任何區別。但僅供參考。

+0

哦......我的錯。沒有看到那個明顯的。在' 現在我得到同樣的錯誤 '(方法放(整數,捕獲#4的); 我改成 '(HashMap中<整數,UI_FieldPV>)this.rearrengeHashMapIdx(this.values_map)?類型HashMap 不適用於參數(Integer,capture#5-of?))' 但現在在這行代碼中(在我的原始文章中發佈的方法中): 'temp.put(i,source.get(newIdx));' UI_FieldPV類順便擴展了JPanel。 – newBee

+0

好吧,我不知道爲什麼,但保存後,關閉並重新啓動日食錯誤消失..... 問題解決了! Ty – newBee

0

我不明白,¿你把「input_map」故意?:

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

也許你需要這樣的東西:

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

感謝您的幫助!我沒有看到這個愚蠢的錯誤。但它只是「轉移」了問題(請參閱第二篇文章的答案) – newBee