如何使用“ 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;

}

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

任何了解泛型的人都请解释一下吗?正如您可以清楚地看到的那样,我并不精通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

回到顶部