我工作的一個項目,我稍微停留在它的一個方面。我需要創建一個可以操縱其他類的實例集合的類。作爲其中的一部分,它爲每個實例創建一個包裝器對象,該對象必須能夠保存實例,但對其執行某些操作(包括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進行參數化,但是將其除去會產生「原始類型」警告,因此我已將它們留下。
感謝所有。
您使用的是現代的IDE像Eclipse,Netbeans的或的Intelli-J?如果你是這樣,你不應該陷入這種類型的問題,因爲它們提供方法完成,你會看到add()方法不存在。 – SteveD 2009-10-05 12:12:37
但我還補充說,我們都一直在那裏尋找一個問題的超複雜的原因,發現最後這是一件愚蠢的事情;-) – SteveD 2009-10-05 12:15:30
D'oh!事實上,我正在使用一個現代化的IDE - 特別是Eclipse ...而我仍然錯過了它。我認爲這是一個類型問題。謝謝。 – CPerkins 2009-10-05 12:30:22