我正在测试Effective Java 2nd Edition Book中提到的对象Equals方法的对称契约。
对称:对于任何非空引用值x和y,必须返回x.equals(y) 当且仅当y.equals(x)返回true时才返回true。
你能解释一下 - 为什么list.contains(s)
仍然在下面的代码中返回false。
public final class CaseInsensitiveString {
private final String s;
public CaseInsensitiveString(String s) {
if (s == null)
throw new NullPointerException();
this.s = s;
}
// Broken - violates symmetry!
/*
* @Override public boolean equals(Object o) {
* if (o instanceof CaseInsensitiveString)
* return s.equalsIgnoreCase(((CaseInsensitiveString) o).s);
* if (o instanceof String) // One-way interoperability
* return s.equalsIgnoreCase((String) o); return false;
* }
*/
@Override
public boolean equals(Object o) {
return o instanceof CaseInsensitiveString
&& ((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}
public int hashcode() {
return 0;
}
public static void main(String[] args) {
CaseInsensitiveString cis = new CaseInsensitiveString("Polish");
String s = "polish";
// System.out.println(cis.equals(s));
// System.out.println(s.equals(cis));
List<CaseInsensitiveString> list = new ArrayList<CaseInsensitiveString>();
list.add(cis);
System.out.println(list.contains(s));
}
}
答案 0 :(得分:4)
该列表包含CaseInsensitiveString
的单个实例。 s
是一个 String
实例,不能等于任何CaseInsensitiveString
,因为o instanceof CaseInsensitiveString
方法中显示的equals
将返回false
。
如果您使用两个CaseInsensitiveString
实例测试代码,这两个实例由不同情况下包含相同值的字符串构成,您会看到contains
调用将返回true
:
CaseInsensitiveString titleCase = new CaseInsensitiveString("Polish");
CaseInsensitiveString lowerCase = new CaseInsensitiveString("polish"); // Here!
List<CaseInsensitiveString> list = new ArrayList<CaseInsensitiveString>();
list.add(titleCase);
System.out.println(list.contains(lowerCase)); // prints true
答案 1 :(得分:2)
由于s
是String
,因此o instanceof CaseInsensitiveString
将返回false。