我有一个接受泛型类型的类,我想以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<?>)
我实际上并没有检查完全正确的事情。我实际上想检查 typeT
而不是 type ?
。每当我尝试?
进入T
时,我都会收到一些错误,例如:
无法对参数化类型执行 instanceof 检查
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;
}
但这对于额外的方法参数看起来真的很尴尬,而且它也不是像 is 这样的内置函数equals
。
任何了解泛型的人请解释一下?正如您清楚地看到的那样,我对Java不是那么精通,所以请更详细地解释一下!