Ich habe eine Klasse, die eine generischen Typ akzeptiert, und ich möchte die equals
Methode in einer nicht umständlichen Weise überschreiben (d. H. Etwas, das sauber aussieht und eine minimale Menge an Code, aber für einen sehr allgemeinen Anwendungsfall).Wie implementiert man "gleich" -Methode für Generika mit "instanceof"?
Im Moment habe ich so etwas wie diese:
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;
}
}
Which, ich bin zu raten, ist ziemlich fehlerhaft - ich bin eine Besetzung zu SingularNode<T>
auf dem other
Objekt zu tun, was könnte möglicherweise einen Fehler aus,.
Eine andere Sache ist - wenn ich if(other instanceof SingularNode<?>)
mache, überprüfe ich eigentlich nicht genau das Richtige. Ich möchte tatsächlich gegen den Typ T
und nicht Typ ?
überprüfen. Jedes Mal, wenn ich versuche, die ?
in T
zu machen, bekomme ich einige Fehler wie:
Kann nicht instanceof prüfen gegen parametrisierte Typ
SingularNode<T>
auszuführen. Verwenden Sie das FormularSingularNode<?>
statt, da eine weitere generische Typinformationen zur Laufzeit gelöscht werden
Wie kann ich dieses Problem umgehen? Gibt es eine Möglichkeit zu tun?
Ich nehme an gibt es eine wirklich hässliche Hack-Lösung wie folgt aus:
@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;
}
Aber das sieht einfach wirklich umständlich mit dem zusätzlichen Verfahrensparameter, und es ist auch keine eingebaute Funktion wie equals
ist.
Jeder, der Generika verstehen, bitte erklären Sie dies? Ich bin nicht so gut mit Java vertraut, wie Sie deutlich sehen können, also erklären Sie bitte mit ein bisschen mehr Detail!
Der Fehler, den Sie haben, ist, weil sowieso die generischen Typen gelöscht werden. Ich denke, das "T" sollte sich um die Überprüfung kümmern, ob das bestandene Element der gleichen Klasse angehört. –
@MichalBorek mmm Könntest du bitte ein wenig ausarbeiten? Ich verstehe nicht ganz. Also in einer anderen Klasse, wenn ich folgendes mache: 'new SingularNode (5) .equals (neuer SingularNode ('k'));' Wissen Sie zufällig, wo die Überprüfung stattfindet? –
Ich habe eine Antwort hinzugefügt, um eine Menge Code zu schreiben. –