Javaでの列挙と自己限定タイプの汎用性
1811 ワード
JavaのすべてのenumはJava.lang.Enumクラスから継承され、Enumクラスの定義は次のとおりです.
定義から明らかなように,Enumクラスは自己限定型の汎用型を用いている.
自己限定のタイプパラメータには意味がありますか?汎用パラメータは、定義されているクラスと同じ(または同じベースクラス)でなければならないことを保証します.たとえば、次のようにします.
AbsEnumは、AbsEnumから継承されたすべてのサブクラスの汎用パラメータが必要である場合にAbsEnumのサブクラスを使用するベースクラスです.これは汎用型に境界を提供することに相当する.
汎用クラスを定義すると
コンパイラがやっていることは、このenumをEnumクラスのサブクラスにコンパイルし、逆コンパイルツールを使用して得ることです.
これにより、Monthという列挙クラスのインスタンスは、Monthのインスタンス(前例のMyEnum 1とMyEnum 2)と比較するだけで、2つの異なる列挙クラス(前例のMyEnum 3)は比較されないことが保証される.
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)は比較されないことが保証される.