如何使用“ instanceof”实现泛型的“等于”方法?
我有一个接受 通用类型的类 ,并且我想以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
is 这样的内置函数。
任何了解泛型的人都请解释一下吗?正如您可以清楚地看到的那样,我并不精通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编译泛型的更多信息,
https://docs.oracle.com/javase/tutorial/java/generics/erasure.html
以上是 如何使用“ instanceof”实现泛型的“等于”方法? 的全部内容, 来源链接: utcz.com/qa/418295.html