2009-10-05 58 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