以下编码错误是可能的,因为布尔等号(Object)方法不需要布尔/布尔参数:
private void foo() {
Boolean isSomeConditionTrue = false;
String doSomething = "YES";
if(isSomeConditionTrue.equals(doSomething)) {
// Do Something
}
}
这段代码不会“做某事”因为编码器忘记在谓词中将doSomething评估为String。为什么Boolean等于接受Object而不是boolean / Boolean作为参数?
答案 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”忽略大小写。 “是”不会解析为真。