【问题标题】:When I override the "put(K key, V value)" in a TreeMap, how can I change "value"?当我在 TreeMap 中覆盖“put(K key, V value)”时,如何更改“value”?
【发布时间】:2015-03-07 06:08:32
【问题描述】:

我扩展了一个 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。

我知道这与泛型有关。在覆盖的“put()”中更改“值”似乎是一件合理的事情,但我想不通。

【问题讨论】:

  • 作为一般的最佳实践,让MyMap 包含一个普通的TreeMap 比继承TreeMap 并违反其规范可能更好。

标签: java generics overriding


【解决方案1】:

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

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

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

非常相似的问题:Unboxing issues

【讨论】:

    【解决方案2】:

    问题在于,当声明 MyMap 时,您告诉 Java 编译器您有两种泛型类型:“K”和“Integer” .因此,“Integer”不是java.lang.Integer数值类,而是可以是any类的泛型类型。由于 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多