等于不使用不同数据类型的相同值

时间:2015-02-12 10:10:11

标签: java

我有两个对象如下:

Object obj1 = new BigDecimal(123);
Object obj2 = new Long(123);

if(obj1.equals(obj2))
 System.out.println("both are equal");
else
 System.out.println("both are not equal");

显示两者不相等。是基于数据类型进行比较吗?

5 个答案:

答案 0 :(得分:1)

  

是否根据数据类型进行比较?

是的,正如它记录的那样。来自BigDecimal.equals

  

返回当且当且仅当指定的对象是BigDecimal时,其值和比例等于此BigDecimal

来自Long.equals

  

当且仅当参数不为null且且Long对象包含与此对象相同的long值时,结果才为真。

对于不同类型的对象来说,相互比较是非常不错的好主意 - 通常在equals实现中,您会遇到类似的事情:

if (getClass() != other.getClass()) {
    return false;
}

或者,如果您的课程为final,则可以使用:

if (!(other instanceof MyClass)) {
    return false;
}

答案 1 :(得分:1)

当然,你的Object并不相同。

equalsBigDecimal的{​​{1}}覆盖检查引用类型分别为LongBigDecimal作为早期检查。

Long

BigDecimal

if (!(obj instanceof BigDecimal)) return false; // not a decimal

Long

您可以按如下方式改进代码:

if (obj instanceof Long) {
    return value == ((Long)obj).longValue();
}
return false;

答案 2 :(得分:0)

  

显示两者并不相等。是基于数据类型进行比较吗?

是的,如果您查看BigDecimal的equals()实现,您会看到以下内容

@Override
public boolean equals(Object x) {
    if (!(x instanceof BigDecimal))
        return false;

如果要比较的对象不是相同的类型,则标准做法返回false。这同样反映在BigDecimal#equals()的Java文档中。

答案 3 :(得分:0)

是的,它正在检查第二个参数是BigDecimal

BigDecimal课程中的代码:

public boolean equals(Object x) {
        if (!(x instanceof BigDecimal)) // gets Long here. SO returns false
            return false;
       .....
}

注意相同值的不同类型不同

答案 4 :(得分:0)

因为他们实际上并不相同!

你必须更好地了解什么"平等的方法"应该做的。

您不是在比较数字,而是在比较对象,并且您获得的答案符合方法的合同