Wenn Sie Class<T>
als Teil eines Schlüssels eines Map
verwenden müssen, was ist der richtige Weg, um hashCode
und equals
zu definieren?
A Class<T>
erbt die von Object
, die nach Referenzgleichheit suchen und die Speicheradresse als Hashcode zurückgeben, aber in meinen Augen ist nicht klar, was die sinnvolle Definition von equals
und hashCode
Definition eines% co_de ist %.
Sollte ich zum Beispiel Class<T>
verwenden (wo wir theClass.getClass().hashCode();
haben), um die Methoden der tatsächlichen Instanz zu benutzen?
Aber das scheint nicht richtig zu sein.
Zum Beispiel in javadoc für Class<T> theClass;
:
Jedes Array gehört auch zu einer Klasse, die als Klasse wiedergegeben wird Objekt, das von allen Arrays mit demselben Elementtyp und geteilt wird Anzahl der Dimensionen
So scheint es in einigen Fällen das gleiche Class<T>
unter Objekten zu teilen? Also, was wäre der Weg zu folgen? Vielleicht verwenden Sie Class<T>
und theClass.hashCode()
, um die Referenzgleichheit zu verwenden? Nicht sicher hier.
Die Implementierung von hashCode
und equals
java.lang.Class
erbt von java.lang.Object
ist sinnvoll und normalerweise angemessen, da alle Instanzen einer Klasse garantiert das gleiche Class
-Objekt zurückgeben von getClass()
, dh
Dies ist etwas in den Dokumenten vergraben; das javadoc von getClass () schreibt:
Rückgabe:
Das Klassenobjekt, das die Laufzeitklasse dieses Objekts darstellt.
Siehe auch:
Literale, Abschnitt 15.8.2 der Java ™ -Sprachspezifikation.
Dieser Abschnitt schreibt:
Ein Klassenliteral wertet das Klassenobjekt für den benannten Typ (oder für void) aus, wie es vom definierenden Klassenlader (§12.2) der Klasse der aktuellen Instanz definiert wird.
und Abschnitt 12.2 schreibt:
Gut funktionierende Klassenlader haben diese Eigenschaften:
- Unter dem gleichen Namen sollte ein Lader einer guten Klasse immer das gleiche Klassenobjekt zurückgeben.
- ...
Ein bösartiger Klassenlader könnte diese Eigenschaften verletzen. Es konnte jedoch die Sicherheit des Typsystems nicht untergraben, da die Java Virtual Machine dagegen wappnet.
Und wenn die gleiche Klassendefinition von verschiedenen Klassenladern geladen wird, sind die Klassenobjekte nicht gleich. Da die Runtime diese als unabhängige Klassen behandelt (die zufällig denselben Namen haben, aber ansonsten nicht ähnlich sein müssen, geschweige denn binär kompatibel), ist dies normalerweise erwünscht.