为什么布尔值 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()
定义在Object
class.
没有可能的签名可以满足您的要求。
(没有使 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。
可能会出现以下编码错误,因为 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()
定义在Object
class.
没有可能的签名可以满足您的要求。
(没有使 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。