代码之家  ›  专栏  ›  技术社区  ›  CPerkins

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

  •  3
  • CPerkins  · 技术社区  · 15 年前

    我正在做一个项目,我有点被它的一个方面卡住了。我需要创建一个类,它可以操作其他类的实例集合。作为其中的一部分,它为每个实例创建一个包装器对象,该对象不仅必须能够保存实例,而且还必须能够对其执行某些操作(包括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));
    

    谢谢大家。

    2 回复  |  直到 15 年前
        1
  •  4
  •   eljenso    15 年前
    1. 它是 put(..) add(..)
    2. 你在试图添加 KeyWrapper ValueWrapper this.map.put(..)
    3. 您不需要参数化 钥匙套 包装纸 K V 已通过 MapWrapper
        2
  •  5
  •   Konrad Rudolph    15 年前

    put add