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

标签 java collections

我正在做一个项目,我有点卡在其中的一个方面。我需要创建一个可以操作其他类实例集合的类。作为其中的一部分,它为每个实例创建一个包装器对象,该对象不仅要能够保存实例,还要对其执行某些操作(包括 equals/hashcode)。

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

顺便说一句,我知道我在这里描述的内容听起来像是我在重新发明 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>> ();
    // ...

到目前为止一切似乎都很好,但我似乎无法将条目添加到我包含的 map 中:


    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));

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

感谢大家。

最佳答案

错误说明了一切。您要查找的方法称为 put,而不是 add

关于java - 泛型和集合 - 类型未定义的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1519674/

相关文章:

java - 为什么 java 安全管理器既不禁止创建 new Thread() 也不禁止启动它?

java - 过滤时获取谓词的反转?

java - Collections.sort没有编译时错误

集合框架中的 Java 集合与映射

Java 日语字符串大小(以字节为单位)

java - 带有静态类列表的 Junit SuiteClasses

java - 使用 'any' 使用 JMockit stub 静态方法

ios - CollectionView 单元格未显示在屏幕上

java - 如何在 Java 中从城市名称中查找国家/地区名称?

java - 在带有空格的字符串上使用 GSON JsonParser