一尘不染

覆盖“等于”方法:如何确定参数的类型?

java

我正在尝试equals为参数化的类重写方法。

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (!(obj instanceof Tuple))
        return false;

    Tuple<E> other = (Tuple<E>) obj; //unchecked cast
    if (!a0.equals(other.a0) && !a0.equals(other.a1)) {
        return false;
    }
    if (!a1.equals(other.a1) && !a1.equals(other.a0)) {
        return false;
    }

    return true;
}

我如何确保<E>other对象与相同this


阅读 212

收藏
2020-12-03

共1个答案

一尘不染

您可以通过保留对Class<E>类型的引用来实现。但是,我认为, 相等性测试应该针对对象表示的值,而不是针对这些值表示的具体类型

一个典型的例子是Collections API。 new ArrayList<String>().equals(new LinkedList<Object>())返回true。尽管它们具有完全不同的类型,但是它们表示相同的值,即“空集合”。

就个人而言,Tuple代表一个相同数据(例如("a", "b"))的两个s是否应该不相等,因为一个是类型,Tuple<String>而另一个是类型Tuple<Object>

2020-12-03