1

私はしばらくの間ネットに潜んでいましたが、これに対する答えはまだ見つかりません. 誰かがClass<T>SO のキーとして言及していますが (私はそう思います)、投稿が見つかりません。いずれにせよ、この質問には適切な回答が必要です (何千もの投稿スレッドがある場合は謝罪します)。

Class<T>不変ですか?キーとして安全かつ効率的に使用できますか (一定hashCode()以上の実行) ?

クラス定義は実行時に変更されないため、私の推測ではイエスです。しかし、よくわかりません...ありがとう!

編集:Javaについて話しています。

4

4 に答える 4

2

1)少なくとも古典的な意味で不変と言えるかどうかはわかりません。見てください

public final class Class<T>
    ...
    native void setSigners(Object[] signers);
    ...
    native void setProtectionDomain0(java.security.ProtectionDomain pd);
    ...
    void setAnnotationType(AnnotationType type) 
    ...

2) HashMap で使用できます。Class はシングルトンであり、その hashCode と equals はその ID に基づいています。ただし、クラスは異なるクラスローダーで異なるインスタンスを持つことに注意してください。したがって、MyClass.class from classloader1 != MyClass.class fromクラスローダー2

于 2013-02-21T05:15:41.923 に答える
2

Java の不変オブジェクトは、通常の (非リフレクション) 実行パスを介して内部状態を変更できないオブジェクトです。この意味は:

  • このクラスは、内部状態を変更するアクセス可能なメソッドを定義していません
  • クラスは、サブクラスがその内部状態を変更するのを防ぐような方法で設計されています

JavaClassクラスは、次の要件を満たしています。

  • 内部状態を変更する方法はありません。
  • クラス自体はfinalであり、サブクラス化することはできません。

もちろん、実際のクラス定義は、クラスローダーを介して JVM によってロードされ、一度定義されると、その JVM の存続期間にわたって設定され、変更されません。

于 2013-02-21T03:23:55.307 に答える
0

hashCode()メソッドClassはオーバーライドされませんが、JDK ではgetClass()メソッドについて次のように指定されています。

public final Class<?> getClass()

このオブジェクトのランタイム クラスを返します。返された Class オブジェクトはstatic synchronized、表されたクラスのメソッドによってロックされたオブジェクトです。

実際の結果の型はClass<? extends |X|>、が呼び出さ|X|れた式の静的型の消去です。getClassたとえば、次のコード フラグメントではキャストは必要ありません。

Number n = 0;
Class<? extends Number> c = n.getClass(); 

したがって、すべてのインスタンスT objに対して、 、T obj2obj.getClass()およびobj2.getClass()は同じ (不変の)Class<T>オブジェクトを返します。

LinkedList<T> l1ただし、型消去には注意してください。これは aまたは aには当てはまりません。どちらも に固有のa ではなく、LinkedList<U> l2型消去クラスを返すためです。Class<LinkedList>Class<LinkedList<T>>T

于 2013-02-21T03:49:08.987 に答える
0

Classはい (同じ名前が与えられた場合、ir は常に同じオブジェクトを返すという意味で、クラスローダーが行儀が良いと仮定します。)

インスタンスのhashCodeはそのオブジェクト ID (再定義しないでください) であり、オブジェクトの存続期間中一定のままです。JLSは、ローダーが到達可能である可能性がある間は、クラスまたはインターフェースをアンロードしてはならないと述べています (オブジェクトのオブジェクト ID が異なるため、アプリケーションに対して透過的ではないクラスの再ロードを避けるため)。ClassClasshashcodeClass

同じ名前のクラスでも、異なるクラス ローダーによってロードされると、ハッシュ コードが異なることに注意してください。通常、これらは実行時の型が異なり、それらのインスタンスは代入に対応していないため、これは問題になりません。

于 2013-02-26T04:04:26.760 に答える