我有两个对象如下:
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");
显示两者不相等。是基于数据类型进行比较吗?
答案 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
并不相同。
equals
和BigDecimal
的{{1}}覆盖检查引用类型分别为Long
和BigDecimal
作为早期检查。
在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)
因为他们实际上并不相同!
你必须更好地了解什么"平等的方法"应该做的。
您不是在比较数字,而是在比较对象,并且您获得的答案符合方法的合同