我正在阅读本书的第二版,第36页。我不了解simmetry问题的解决方案:
@override public boolean equals(Object o) {
return o instanceof CaseInsensitiveString &&
((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}
如果我有CaseInsensitiveString cis= new CaseInsensitiveString("hello")
和String s="hello"
,则表现为非对称,因为s.equals(cis)
是的,但是cis.equals(s)
是假的......
我错过了什么?
答案 0 :(得分:9)
解决方案是正确的,因为没有违反对称性。关于s.equals(cis)
,你错了。它将在任何情况下返回false
,因为String
内部测试其他对象是否也是String
的实例,如果没有,则返回false
。 (CaseInsensitiveString
因为String
是s.equals(cis)
而false
是cis.equals(s)
,所以给出了对称性。
关于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
中的类型检查!