ジェネリック型を受け入れるクラスがあり、メソッドを邪魔にならない方法でオーバーライドしたい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
される可能性があります。
もう1つのことは、私がそうするとき、if(other instanceof SingularNode<?>)
実際には正確に正しいことをチェックしていないということです. T
typeではなく typeに対してチェックしたいのです?
。?
をにしようとすると、次のT
ようなエラーが発生します。
パラメータ化された型に対して instanceof チェックを実行できません
SingularNode<T>
。SingularNode<?>
それ以上のジェネリック型情報は実行時に消去されるため、代わりにフォームを使用してください。
どうすればこれを回避できますか? 何か方法はありますT.class.isInstance(other);
か?
次のような本当に醜いハックソリューションが1つあると思います。
@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 にそれほど精通していないので、もう少し詳しく説明してください。