为什么布尔类中重写的equals(Object)方法不需要boolean / Boolean作为参数

时间:2015-02-04 16:17:20

标签: java equals

以下编码错误是可能的,因为布尔等号(Object)方法不需要布尔/布尔参数:

private void foo() {
    Boolean isSomeConditionTrue = false;
    String doSomething = "YES";
    if(isSomeConditionTrue.equals(doSomething)) {
        // Do Something
    }
}

这段代码不会“做某事”因为编码器忘记在谓词中将doSomething评估为String。为什么Boolean等于接受Object而不是boolean / Boolean作为参数?

3 个答案:

答案 0 :(得分:9)

因为equals()类中定义了Object

没有可能的签名可以做你想做的事 (没有使Object通用,这会破坏目的)

答案 1 :(得分:3)

此方法会覆盖

Object.equals(Object)

因此必须接受所有对象。

同样你可以写

if (isSomeConditionTrue == doSomething) 

即使这也不可能是真的。

解决这个问题的一种方法是避免使用无论如何都不能为null的Wrappers。即只有Boolean不为空,您的代码才有效,所以不要使用包装器,请使用原语。

private void foo() {
    boolean isSomeConditionTrue = false;
    String doSomething = "YES";
    if(isSomeConditionTrue == doSomething) { // doesn't compile
        // Do Something
    }
}

原语不仅速度更快,而且更清晰,值不能为空,您可以使用== != >等常规Java操作。

答案 2 :(得分:0)

equals()是Object上的方法,方法契约要求参数为Object。 equals的合同规定如果对象是错误的类型,那么它应该返回false。

因此,您必须先将doSomething转换为布尔值。请注意,即使Boolean.parseBoolean(String)只返回一个Boolean.TRUE,如果字符串单词“true”忽略大小写。 “是”不会解析为真。