等于-Java中的对称合同似乎给了问题

Arjun

我正在测试《有效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));
    }

}
穆雷尼克

该列表包含的一个实例CaseInsensitiveStrings是一个String实例,不能等于任何实例,CaseInsensitiveString因为o instanceof CaseInsensitiveStringequals方法中出现实例将返回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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章