8

Class<T>a のキーの一部としてa を使用する必要がある場合、 andMapを定義する適切な方法は何ですか? Aは参照の等価性をチェックし、メモリアドレスをハッシュコードとして返すものを継承しますが、私の考えでは、意味のある定義と a の定義が何であるかは明確ではありません。実際のインスタンスのメソッドを使用するには、たとえば ( がある場合) を 使用する必要がありますか? しかし、これは正しいことではないようです。 たとえば、次のjavadocの場合: hashCodeequals
Class<T>ObjectequalshashCodeClass<T>
theClass.getClass().hashCode();Class<T> theClass;

Class<T>

すべての配列は、要素の型と次元数が同じすべての配列によって共有される Class オブジェクトとして反映されるクラスにも属します。

場合によっては、同じものClass<T>がオブジェクト間で共有されているように見えますか? では、従うべき道は何でしょうか?おそらく参照の等価性を使用するためtheClass.hashCode()に andを使用しますか? theClass.equals()ここではまったくわかりません。

4

2 に答える 2

9

クラスのすべてのインスタンスがから同じオブジェクトを返すことが保証されているため、hashCodeおよびequals java.lang.Classinheritsの実装は意味があり、通常は適切です。java.lang.Object ClassgetClass()

new Integer(2).getClass() == new Integer(3).getClass();

これはドキュメントにやや埋もれています。getClass()のjavadoc には次のように書かれています。

戻り値:

このオブジェクトのランタイム クラスを表す Class オブジェクト。

関連項目:

リテラル、Java™ 言語仕様のセクション 15.8.2。

そのセクションは次のように書いています。

クラス リテラルは、現在のインスタンスのクラスの定義クラス ローダー (§12.2) によって定義されているように、指定された型 (または void) の Class オブジェクトに評価されます。

そしてセクション12.2は次のように書いています:

正常に動作するクラス ローダーは、次のプロパティを維持します。

  • 同じ名前を指定すると、優れたクラス ローダーは常に同じクラス オブジェクトを返す必要があります。
  • ...

悪意のあるクラス ローダーがこれらのプロパティに違反する可能性があります。ただし、型システムのセキュリティが損なわれることはありません。これは、Java 仮想マシンがこれを防ぐためです。

はい、同じクラス定義が異なるクラスローダーによってロードされた場合、クラスオブジェクトは等しくなりません。ランタイムはこれらを独立したクラス (たまたま同じ名前を共有しているが、バイナリ互換性はもちろんのこと、他の点では似ている必要はない) として扱うため、通常はこれが望まれます。

于 2012-09-16T13:15:28.160 に答える
0

このメソッドは、クラスの一意のString getName()文字列表現を返します。プログラムで複数のクラスローダを使用しない場合は、この String for equals/hashCode を通常の String として使用できます。

于 2012-09-16T12:59:54.507 に答える