有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当我重写树形图中的“put(K键,V值)”时,如何更改“value”?

我扩展了一个树映射,覆盖了“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)的方法。。。JAVAlang.整数不能转换为整数

我知道这和泛型有关。修改被重写的“put()”中的“value”似乎是一件合理的事情,但我无法理解这一点


共 (2) 个答案

  1. # 1 楼答案

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

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

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

    非常相似的问题:Unboxing issues

  2. # 2 楼答案

    问题是,在声明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;
            }
        }
    

    这只是另一个编译但没有意义使用的示例(只是为了让您更好地了解发生了什么):

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