我有一个接受通用类型的类,并且我想以一种不尴尬的方式覆盖equals方法(即看起来很干净且代码量最少的东西,但用于非常普通的用例)。

现在我有这样的事情:

public class SingularNode<T> {
    private T value;

    @SuppressWarnings("unchecked")
    @Override
    public boolean equals(Object other){
        if(other instanceof SingularNode<?>){
            if(((SingularNode<T>)other).value.equals(value)){
                return true;
            }
        }
        return false;
    }
}

我猜这是非常有缺陷的-我正在对SingularNode<T>对象上的other进行强制转换,这可能会引发错误。

另一件事是-当我执行if(other instanceof SingularNode<?>)时,我实际上并不是在检查正确的事情。我实际上想检查T类型而不是?类型。每当我尝试将?变成T时,都会出现类似以下错误:



我该如何解决?有什么办法可以做T.class.isInstance(other);吗?

我想有一个像这样的丑陋的骇客解决方案:
@SuppressWarnings("unchecked")
public boolean isEqualTo(Class<?> c, Object obj){
    if(c.isInstance(obj) && c.isInstance(this)){
        if(((SingularNode<T>)obj).value.equals(value)){
            return true;
        }
    }
    return false;
}

但是,使用额外的方法参数看起来确实很尴尬,并且它也不像equals这样的内置函数。

任何了解泛型的人都请解释一下?正如您可以清楚地看到的那样,我不是Java熟练者,所以请详细解释一下!

最佳答案

这个版本没有警告

public boolean equals(Object other){
    if (other instanceof SingularNode<?>){
        if ( ((SingularNode<?>)other).value.equals(value) ){
            return true;
        }
    }
    return false;
}

至于强制转换为SingularNode<T>并没有帮助,您不能假定T可以是Object以外的任何东西。

在以下网址了解有关如何用Java编译泛型的更多信息。

07-24 09:37