覆盖equals并将对象强制转换为字符串

时间:2014-07-29 13:02:01

标签: java object vector compare

编辑:问题是为什么我不能使用“.contains”(在对象中覆盖.equals())来比较对象属性(字符串)而不是比较对象本身。 谢谢JB: 事实证明,我正在混淆覆盖compareTo()和覆盖equals()

编辑: 问题重新定义:

为什么我无法覆盖等于比较对象中的字符串:

public boolean equals(Object obj){
  ...
  if(obj instanceof String){
    String testString = (String) obj;
    ...
  }
  ...
}

甚至超载:

public boolean equals(String stringObj){
  ...  
}

我在某处读到编译器不使用逻辑来决定它,它使用类型。所以如果我然后调用myObj.equals(stringOne + "_" + stringTwo)不应该这样,因为它知道正在传递一个字符串? 谢谢,
史蒂夫。

1 个答案:

答案 0 :(得分:1)

为什么这段代码没有意义:

  1. 因为Comparable应该遵守规则:如果a < b为真,那么b > a必须为真。您可以将类的实例与String进行比较,但String不能与自定义类的实例进行比较。你因此违反了可比较的合同
  2. 因为Vector没有使用compareTo()来检查元素是否存在。它使用equals()
  3. 因为您不应该改变类的性质,只是为了实现一个特定的用例,包括将此类的实例添加到列表中并检查重复项。这个逻辑应该在课堂之外。在创建自定义类实例之前,您可以简单地遍历列表并检查项目和位置是否已存在的实例。
  4. 因为你不应该使用Vector多年(因为Java 2 - 我们是Java 8)。而且由于目标似乎是避免重复,因此您应该使用的是Set
  5. 做正确的事,并使用HashSet。确保CustomClass正确实现equals()hashCode()。您还可以使用HashMap<CustomClassKey, CustomClass>,其中CustomClassKey是一个包含标识CustomClass实例的两个字段的简单类。