在equals()方法中测试泛型类型

时间:2015-03-12 18:04:42

标签: java collections

我有以下课程。

public class Combination<E extends Comparable> {

    private List<E> objects;

    // ...

    @Override
    public boolean equals(Object o) {
        // ...
    }

    @Override 
    public int hashCode() {
        // ...
    }
}

我正在覆盖equalshashCode方法,因此我可以轻松创建Set<Combination>并且没有任何多余的组合。

问题是......因为我的班级有通用类型,我如何在equals方法中测试这种类型?例如,Combination<Integer>Combination<Double>Combination<Car>不同。但是如何在equals方法中测试呢?

理想情况下,我可以覆盖equals方法以接受Combination<E>参数。一个简单的解决方案是重载equals方法吗?例如,

@Override
public boolean equals(Object o) {
    // This method will only be called when o is not an instance of Combination<E>.
    // So in this case return false.
    return false;
}

public boolean equals(Combination<E> cmb) {
    // Compare the two combinations here.
    // <code> ...
}

3 个答案:

答案 0 :(得分:4)

这里的解决方案是信任成员对象的equals方法只匹配正确的类型。你需要在这里使用instanceof,你不应该使用rawtypes,但它应该看起来像

@Override public boolean equals(Object o) {
  if (o instanceof Combination) {
    Combination<?> c = (Combination<?>) o;
    return objects.equals(c.objects);
  }
  return false;
}

这是类型安全的,并且工作正常,并且信任List(及其元素)以正确实现自己的equals方法。

答案 1 :(得分:2)

你完全不能像在Java中提出的那样

  1. 在Java中,在编译类型中删除了泛型,因此您只是在运行时没有类型参数信息
  2. equals()不能使用与Object不同的参数,即重载,而不是覆盖
  3. 可以轻松实现类似的语义功能。您应该委托objects.equals() from您的equals()方法,如果对象传入组合类,这将有效对象正确实现equals()hashCode()

答案 2 :(得分:1)

你过分复杂了平等的概念。只需从equals方法中分解另一个实例,并比较每个成员的有效状态。

public class Foo<T> {
  T field;
  public Foo(T f){
    field = f;
  }

  @Override
  public boolean equals(Object o){
    // leaving off the standard instanceof checking
    Foo other = (Foo)o;
    return field.equals(other.field);
  }
}