【发布时间】:2015-02-04 16:17:20
【问题描述】:
可能会出现以下编码错误,因为 Boolean equals(Object) 方法不需要 boolean/Boolean 参数:
private void foo() {
Boolean isSomeConditionTrue = false;
String doSomething = "YES";
if(isSomeConditionTrue.equals(doSomething)) {
// Do Something
}
}
此代码不会“做某事”,因为编码人员忘记在谓词中将 doSomething 评估为字符串。为什么布尔等于接受 Object 而不是 boolean/Boolean 作为参数?
【问题讨论】:
-
因为它继承自
Object.equals(Object obj) -
将此归结为 LSP(每个对象都必须符合 Object)。然而,并非所有类型系统都以这种方式工作。我个人认为 C# 通过允许 non polymorphic 运算符重载得到了它的大部分正确性,所以
isComeConditionTrue == doSomething(在 C# 中)会导致编译器错误,而使用Equals(在 C# 中)会有相同的问题,如此处所示。 Object 中多态 equals 的一个很好(或强制)的情况是,当用作集合的一部分时,不需要沿着“可比较”或“相等”接口进行细化。