我扩展了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;这似乎是一件合理的事情,但我无法解决这个问题。
答案 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;
}
}