2009-10-05 60 views
3

我工作的一個項目,我稍微停留在它的一個方面。我需要創建一個可以操縱其他類的實例集合的類。作爲其中的一部分,它爲每個實例創建一個包裝器對象,該對象必須能夠保存實例,但對其執行某些操作(包括equals/hashcode)。泛型和集合 - 方法未定義類型

所以構造不僅需要被包裝的對象,而且還包括來電者告訴我們,可以按所需的方式(這可以從包含的對象原生的行爲有所不同)執行這些操作的函數對象。

順便說一句,我知道什麼,我在這裏描述聽起來像我重塑集合框架的一部分,但我在這裏簡單。


public class MapWrapper<K,V> { 
    private class KeyWrapper<K> { 
     K key; 
     public KeyWrapper(K key) { 
      // ... 
     } 
    } 
    private class ValueWrapper<V> { 
     V value; 
     public ValueWrapper(V value) { 
      // ... 
     } 
    } 

    // ... 
    HashMap<KeyWrapper<K>, ValueWrapper<V>> map 
      = new HashMap<KeyWrapper<K>, ValueWrapper<V>>(); 
    // ... 

似乎一切會好起來的,到目前爲止,但我似乎無法將條目添加到我的載圖:


    public MapWrapper (HashMap<K, V> map) { 
     // ... 
     map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val)); 
     // ... 
    } 

這失敗的編譯,此消息:

    「方法把(K,V)放入類型HashMap < K,V >不適用於參數(HashPlus.KeyWrapper,HashPlus.ValueWrapper)

而且我不知所措。這種類型的擦除工作?我不這麼認爲 - 這一切都在同一個編譯單元,並且它不會放棄對HashMap<Object,Object> - 它拖放到HashMap<K,V>,這似乎很奇怪。

想法?指向明顯的遺漏?

更新和解決方案:基於從多個響應者建議 ,我取代了原來的「添加」符合:


     this.map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val)); 

而且這個整理我的問題。注意:一位響應者建議我不需要在放置線上對KeyWrapper和ValueWrapper進行參數化,但是將其除去會產生「原始類型」警告,因此我已將它們留下。

感謝所有。

+0

您使用的是現代的IDE像Eclipse,Netbeans的或的Intelli-J?如果你是這樣,你不應該陷入這種類型的問題,因爲它們提供方法完成,你會看到add()方法不存在。 – SteveD 2009-10-05 12:12:37

+0

但我還補充說,我們都一直在那裏尋找一個問題的超複雜的原因,發現最後這是一件愚蠢的事情;-) – SteveD 2009-10-05 12:15:30

+0

D'oh!事實上,我正在使用一個現代化的IDE - 特別是Eclipse ...而我仍然錯過了它。我認爲這是一個類型問題。謝謝。 – CPerkins 2009-10-05 12:30:22

回答

4
  1. put(..)沒有add(..)
  2. 你想添加KeyWrapperValueWrapper到地圖的參數,而不是地圖領域。使用this.map.put(..)
  3. 您不需要參數化KeyWrapperValueWrapperKV已經可以通過MapWrapper
5

錯誤說明了一切。您正在查找的方法稱爲put,而不是add