4

我正在阅读本书的第二版,第 36 页。我不明白对称性问题的解决方案:

@override public boolean equals(Object o) {
    return o instanceof CaseInsensitiveString &&
        ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}

如果我有CaseInsensitiveString cis= new CaseInsensitiveString("hello")并且String s="hello"this 以非对称方式表现,因为s.equals(cis) 是真的,但是cis.equals(s) 是假的......

我错过了什么?

4

1 回答 1

9

解是正确的,因为没有违反对称性。你错了s.equals(cis)。如果另一个对象也是 instanceof ,它会false在任何情况下作为内部测试返回,否则返回。(并且不扩展StringStringfalseCaseInsensitiveStringString

s.equals(cis)isfalsecis.equals(s)is false,给出了对称性。

旁注关于instanceof

请注意,String#equals(Object o)用于o instanceof String检查其参数的类型。这只是正确的,因为String它是final并且不能被子类化!否则我们可以编写一个子类,String然后会发生以下情况:

String s = "Hello";
SubclassOfString sos = new SubclassOfString("Hello");
s.equals(sos) == true // as sos is instanceof String
sos.equals(s) == false // as s is NOT instanceof SubclassOfString

因此,如果您的类不是final,请使用this.getClass() == o.getClass()而不是instanceof用于类型检查equals(Object)

于 2013-11-22T16:56:53.237 回答