我正在测试《有效Java 2nd Edition手册》中提到的对象Equals方法的对称协定。
对称的:对于任何非空参考值x和y,当且仅当y.equals(x)返回true时,x.equals(y)才必须返回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));
}
}
该列表包含的一个实例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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句