泛型和集合 - 类型未定义的方法

CPe*_*ins 3 java collections

我正在研究一个项目,我对它的某个方面略有不满.我需要创建一个可以操作其他类实例集合的类.作为其中的一部分,它为每个实例创建一个包装器对象,它必须不仅能够保存实例,还能对其执行某些操作(包括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>> ();
    // ...
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切似乎都没问题,但我似乎无法在我包含的地图中添加条目:


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

编译失败,显示以下消息:

    "在HashMap <K,V>类型中放置(K,V)的方法不适用于参数(HashPlus.KeyWrapper,HashPlus.ValueWrapper)

而我却不知所措.这种类型的擦除是否起作用?我不这么认为 - 它都在同一个编译单元中,并且它没有下降到HashMap<Object,Object>- 它正在下降HashMap<K,V>,这看起来很奇怪.

思考?指向明显遗漏的指针?

更新和解决方案: 根据多个响应者的建议,我将原来的"添加"行替换为:


        this.map.put(new KeyWrapper<K>(key), new ValueWrapper<V>(val));
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.注意:一个响应者建议我不需要在put行上参数化KeyWrapper和ValueWrapper,但删除它会产生"原始类型"警告,所以我把它们留在了.

谢谢大家.

Kon*_*lph 5

错误说明了一切.你正在寻找的方法put不是add.