我有一个接受通用类型的类,并且我想以一种不尴尬的方式覆盖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编译泛型的更多信息。