java – 为什么是Long.valueOf(0).equals(Integer.valueOf(0))false?

这个问题是strange HashMap.put() behaviour提示的

我想我明白为什么Map< K,V> .put需要一个K,但是Map< K,V> .get采取一个对象,似乎没有这样做会打破太多的现有代码。

现在我们遇到一个非常容易出错的情况:

java.util.HashMap<Long, String> m = new java.util.HashMap<Long, String>();
m.put(5L,"Five"); // compiler barfs on m.put(5, "Five")
m.contains(5); // no complains from compiler, but returns false

如果Long值在int范围内并且值相等,则返回true是否可以解决?

这是Long.java的源码

public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

即它需要是一个长类型才能相等。我认为主要区别在于:

long l = 42L
int i = 42;
l == i

上面的例子是,使用原语可以发生int值的隐式扩展,但是对于对象类型,没有隐式从Integer转换为Long的规则。

另外看看Java Puzzlers,它有很多类似的例子。

翻译自:https://stackoverflow.com/questions/445990/why-is-long-valueof0-equalsinteger-valueof0-false

转载注明原文:java – 为什么是Long.valueOf(0).equals(Integer.valueOf(0))false?