HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

列挙型に含まれる全要素の取得

EnumMapやEnumSetを見ていて、ふと疑問に思ったのが、これらのクラス内で列挙型に含まれる全要素の個数や値が必要になるはずだがどうやって取得しているのか、ということ。
通常、列挙型

enum A {
    A_1,
    A_2,
    A_3;
}

に対して、

A[] vals = A.values();

と書くが、

public class EnumSet<E extends Enum<E>> {
    ‥
        E[] vals = E.values();
    ‥
}

とは書けないよね‥と思いながらソースコードをよく読んでみると、Classクラスにちゃんとメソッドがありました。

public final
    class Class<T> implements ‥ {
    ‥
    public T[] getEnumConstants() {
    ‥
}

JavaDocによると、

Returns the elements of this enum class or null if this Class object does not represent an enum type.

だそうです。
だから、EnumMapクラスのコンストラクタやEnumSetクラスのnoneOf()メソッド、allOf()メソッドにClassオブジェクトを渡すのですね。