当我覆盖" put(K键,V值)"在TreeMap中,我怎样才能改变"值"?

时间:2015-03-06 20:19:56

标签: java generics override

我扩展了TreeMap,覆盖" put()",并做了类似的事情:

public class MyMap<K, Integer> extends TreeMap<K, Integer> {
    @Override
    public Integer put(K key, Integer value) throws ClassCastException, NullPointerException {
        java.lang.Integer newValue = java.lang.Integer.valueOf(123);
        super.put(key, newValue); // <--- error message here
        return newValue;
    }
}

错误消息:
没有为put(K,java.lang.Integer)找到合适的方法... java.lang.Integer无法转换为Integer。

我知道它与泛型有关。改变&#34;价值&#34;在被覆盖的&#34; put()&#34;这似乎是一件合理的事情,但我无法解决这个问题。

2 个答案:

答案 0 :(得分:5)

您的Integer类型参数阴影java.lang.Integer

解决方案可能只是删除类的键的类型参数(因为你似乎决定将java.lang.Integer作为值类型)。

class MyMap<K> extends TreeMap<K, Integer> {
    ...
}

非常相似的问题:Unboxing issues

答案 1 :(得分:2)

问题在于,在声明 MyMap 时,您告诉Java编译器您有两种通用类型:“ K ”和“整数” 。因此,“整数”不是 java.lang.Integer 数字类,而是可以是任何类的泛型类型。由于 java.lang.Integer 不一定是您的通用“整数”类型,因此Java编译器会发出错误。

这个例子可以解决问题:

public class MyMap<K> extends TreeMap<K, Integer> {
        @Override
        public Integer put(K key, Integer value) throws ClassCastException, NullPointerException {
            java.lang.Integer newValue = java.lang.Integer.valueOf(123);
            super.put(key, newValue); 
            return newValue;
        }
    }

只是另一个编译但没有意义的例子(只是为了让你更好地理解正在发生的事情):

public class MyMap<K, Integer extends java.lang.Integer> extends TreeMap<K, Integer> {
        @Override
        public Integer put(K key, Integer value) throws ClassCastException, NullPointerException {
            Integer newValue = (Integer) java.lang.Integer.valueOf(123);
            super.put(key, newValue); 
            return newValue;
        }
    }