如何使用“instanceof”为泛型实现“equals”方法?
我有一个接受泛型类型的类,我想以一种不尴尬的方式重写该方法(即看起来干净且代码量最少的东西,但对于非常通用的用例)。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
无法对参数化类型
SingularNode<T>
执行实例检查。请改用SingularNode<?>
的形式,因为将在运行时擦除进一步的泛型类型信息
我该如何解决这个问题?有没有办法做到?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;
}
但是,使用额外的方法参数,这看起来真的很尴尬,而且它也不是像us那样的内置函数。equals
任何了解泛型的人请解释一下吗?正如你所看到的,我对Java并不那么精通,所以请更详细地解释一下!