我有一个接受 通用类型的类 ,并且我想以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对象进行强制转换,这可能会 引发错误 。
SingularNode<T>
other
另一件事是-当我这样做时,if(other instanceof SingularNode<?>)我实际上并不是在检查正确的事情。我实际上想检查类型T而不是类型?。每当我尝试?进入时T,都会出现类似以下的错误:
if(other instanceof SingularNode<?>)
T
?
无法对参数化类型执行instanceof检查SingularNode<T>。请改用表格SingularNode<?>,因为在运行时将删除更多的通用类型信息
SingularNode<?>
我该如何解决?有T.class.isInstance(other);什么办法吗?
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。
Object
了解有关如何使用Java编译泛型的更多信息,
https://docs.oracle.com/javase/tutorial/java/generics/erasure.html