Javaでの列挙と自己限定タイプの汎用性

1811 ワード

JavaのすべてのenumはJava.lang.Enumクラスから継承され、Enumクラスの定義は次のとおりです.
public abstract class Enum> implements Comparable, Serializable {
    // ...
}

定義から明らかなように,Enumクラスは自己限定型の汎用型を用いている.
自己限定のタイプパラメータには意味がありますか?汎用パラメータは、定義されているクラスと同じ(または同じベースクラス)でなければならないことを保証します.たとえば、次のようにします.
public class Test {
    public static void main(String[] args) {
        MyEnum1 enum1 = new MyEnum1();
        MyEnum1 enum11 = new MyEnum1();

        MyEnum2 enum2 = new MyEnum2();
        MyEnum2 enum22 = new MyEnum2();

        MyEnum3 enum3 = new MyEnum3();
        MyEnum3 enum33 = new MyEnum3();

        enum1.compareTo(enum11);
        enum2.compareTo(enum22);
        enum3.compareTo(enum2);

    }
}

abstract class AbsEnum> implements Comparable {}


class MyEnum1 extends AbsEnum {
    @Override
    public int compareTo(MyEnum1 o) {
        return 0;
    }
}

class MyEnum2 extends AbsEnum {
    @Override
    public int compareTo(MyEnum2 o) {
        return 0;
    }
}

class MyEnum3 extends AbsEnum {
    @Override
    public int compareTo(MyEnum2 o) {
        return 0;
    }
}

AbsEnumは、AbsEnumから継承されたすべてのサブクラスの汎用パラメータが必要である場合にAbsEnumのサブクラスを使用するベースクラスです.これは汎用型に境界を提供することに相当する.
汎用クラスを定義すると
public enum Month {
    JAN, FEB, MAR;
}

コンパイラがやっていることは、このenumをEnumクラスのサブクラスにコンパイルし、逆コンパイルツールを使用して得ることです.
final class Month extends java.lang.Enum {
    public static final Month JAN;
    public static final Month FEB;
    public static final Month Mar;
}

これにより、Monthという列挙クラスのインスタンスは、Monthのインスタンス(前例のMyEnum 1とMyEnum 2)と比較するだけで、2つの異なる列挙クラス(前例のMyEnum 3)は比較されないことが保証される.