来自以下文档Integer.equals():
当且仅当参数不是
null并且是Integer包含与int此对象相同的值的对象时,结果才为真.
换句话说,一个Integer永远不会为测试equals()一个Long(或其他任何这不是一个Integer),无论价值所代表.只需比较原始值,如果这就是你所追求的.
不允许跨类比较的一个很好的理由是:你会怎么做?假设你决定实现Integer.equals()测试另一个对象是否是一个实例Number并使用比较值other.intValue()(所有Number类都支持).不幸的结果就是那样
Integer.valueOf(42).equals(Long.valueOf(((Integer.MAX_VALUE + 1L) << 1) + 42))
Run Code Online (Sandbox Code Playgroud)
会测试true因为Long.intValue()只是将其值转换为int和
(int) ((Integer.MAX_VALUE + 1L) << 1) + 42)
Run Code Online (Sandbox Code Playgroud)
评估为42,因为这是低32位的内容.更糟糕的是,如果您使用相同的逻辑Long.equals()(测试所有Number使用的对象longValue()),则equals()测试将不再是对称的.