3

初めて EnumMap を使用していますが、パラメーター パスが実際に何をしているのかわかりません。私が知る限り、Kがマップキーである「K.class」だけです。これは問題なく動作しますが、これは Java の他の場所では見たことがなく、構築において実際にどのような役割を果たしているのかはっきりしません。

コードが実行されるため、これは理論的な質問だと思います。「K.class」パラメーターは何を意味し、EnumMap は何のためにそれを必要としますか?

4

2 に答える 2

8

クラス リテラルについては、リンクされた質問を参照してください。

EnumMap列挙型にいくつの異なる値があるかを知る必要があるため、特に必要です。これは、EnumMap が (HashMap のような非常に大きな配列ではなく) 可能なすべての値に対して 1 つのスロットを持つ 1 つの配列のみを使用する列挙型の高度に最適化されたマップ実装であるためです。を呼び出すとget()、指定されたキーのインデックス (つまり、最初の列挙値、2 番目など) が取得され、内部配列の適切な位置が検索されます。このため、コンストラクターは、正しいサイズの配列を割り当てるために可能な値の数を知る必要があります。クラス オブジェクトをgetEnumConstants()指定すると、この列挙型の既存の値の数を調べるために呼び出すことができます。

さらに、次のコードを想像してください。

enum Enum1 { V1, V2; }
enum Enum2 { W1, W2; }
EnumMap<Enum1, Object> map = new EnumMap<Enum1, Object>(Enum1.class);
map.put(Enum1.V1, new Object());
map.get(Enum2.W1);

これで、getメソッドは明らかに を返すはずnullです。ただし、前述したように、マップには内部的に配列が 1 つしかなく、この場合はサイズ 2 で、最初のスロットに新しいオブジェクトがあり、2 番目のスロットに null があります。に渡したときに、Enum1.V1 への参照が保存されませんでしたput()。ただし、メソッドgetは、渡された値が正しい列挙型に属していないことを認識する必要があるため、マップにこのキーの値がありません。ここでも、正しい列挙型の型が必要です。そのためには、型をコンストラクターに渡す必要があります。

列挙型に関する情報をコンストラクターに提供しないと、このマップ インスタンスで使用する列挙型を認識できません。new と書いても、コンストラクタは型消去によりジェネリック型パラメータEnumMap<MyEnum, SomeValue>()の値を知ることができません。MyEnumしたがって、情報をコンストラクターに渡す別の方法が必要です。

于 2014-02-28T20:01:52.617 に答える
2

のソースに基づいてEnumMap: を構築するときに最初に行うことの 1 つは、クラス EnumMap内の列挙定数ごとに 1 つの要素を持つ配列を割り当てることです。効率的であるはずなので、固定配列を割り当てることは理にかなっています。これを行うには、クラスを知る必要があります。型の消去がなければ、 の最初の型パラメーターがどこにあるかを調べることでこれを行うことができます。残念ながら、Java ジェネリックの設計により、これが妨げられています。enumEnumMapK.classKEnumMap<K,V>

于 2014-02-28T20:03:11.840 に答える