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

Why doesn't the overridden equals(Object) method in the Boolean class require a boolean/Boolean as an argument

可能会出现以下编码错误,因为 Boolean equals(Object) 方法不需要 boolean/Boolean 参数:

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

此代码不会 "do something" 因为编码人员忘记将 doSomething 评估为谓词中的字符串。为什么布尔等于接受 Object 而不是 boolean/Boolean 作为参数?

因为equals()定义在Objectclass.

没有可能的签名可以满足您的要求。
(没有使 Object 通用,这会破坏目的)

此方法覆盖

Object.equals(Object)

因此必须接受所有对象。

同样你可以这样写

if (isSomeConditionTrue == doSomething) 

尽管这也永远不会是真的。

解决此问题的一种方法是避免使用无论如何都不能为 null 的 Wrappers。也就是说,您的代码仅在 Boolean 不为 null 时才有效,因此不要使用包装器,请使用原语。

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

基元不仅速度更快,而且更清楚地表明值不能为空,您可以使用正常的 Java 操作,例如 == != > 等.

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

所以你必须先将doSomething转换成布尔值。请注意,如果字符串单词 "true" 忽略大小写,即使 Boolean.parseBoolean(String) 也只会 return 一个 Boolean.TRUE。 "yes" 不会解析为 TRUE。