我正在从事一个项目,但在其中一个方面稍有停留。我需要创建一个可以操纵其他类实例集合的类。作为其一部分,它为每个实例创建一个包装对象,该对象不仅必须能够保存该实例,而且还必须对其执行某些操作(包括equals / hashcode)。

因此,构造函数不仅接受包装的对象,还接受调用者告诉我们可以按所需方式执行这些操作的功能对象(这可能与所包含对象的本机行为不同)。

顺便说一句,我知道我在这里描述的内容听起来像是我在重塑Collections框架的一部分,但是我在这里进行了简化。


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));
        // ...
    }

这将导致编译失败,并显示以下消息:

“类型为HashMap 的put(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,但是将其删除会产生“原始类型”警告,因此我将其保留。

谢谢大家。

最佳答案

  • 这是put(..)而不是add(..)
  • 您正在尝试将KeyWrapperValueWrapper添加到map参数,而不是map字段。使用this.map.put(..)
  • 不需要参数化KeyWrapperValueWrapperKV已经可以通过MapWrapper获得
  • 09-05 05:23