Java 当我重写;放置(K键,V值)“;在树形图中,我该如何更改;价值观;?

Java 当我重写;放置(K键,V值)“;在树形图中,我该如何更改;价值观;?,java,generics,overriding,Java,Generics,Overriding,我扩展了一个树映射,重写了“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

我扩展了一个树映射,重写了“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;
    }
}
公共类MyMap扩展树映射{
@凌驾
公共整数put(K键,整数值)抛出ClassCastException,NullPointerException{
java.lang.Integer newValue=java.lang.Integer.valueOf(123);

super.put(key,newValue);//您的
Integer
类型参数shadows
java.lang.Integer

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

类MyMap扩展了TreeMap{
...
}

非常相似的问题:

问题是,当声明MyMap时,您告诉Java编译器您有两种泛型类型:“K”和“Integer”。因此,“Integer”不是java.lang.Integer数值类,而是可以是任何类的泛型类型。由于java.lang.Integer不一定是泛型“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;
        }
    }
公共类MyMap扩展树映射{
@凌驾
公共整数put(K键,整数值)抛出ClassCastException,NullPointerException{
java.lang.Integer newValue=java.lang.Integer.valueOf(123);
super.put(key,newValue);
返回新值;
}
}
这只是另一个编译但没有意义使用的示例(只是为了让您更好地了解发生了什么):

公共类MyMap扩展树映射{
@凌驾
公共整数put(K键,整数值)抛出ClassCastException,NullPointerException{
Integer newValue=(Integer)java.lang.Integer.valueOf(123);
super.put(key,newValue);
返回新值;
}
}

作为一般的最佳实践,最好的设计是使
MyMap
包含一个普通的
TreeMap
,而不是将
TreeMap
子类化并违反其规范。
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;
        }
    }