为什么不从Enum <E扩展Enum <E >>

khm*_*ise 4 java enums

我偶然发现了以下问题,我无法从Java 1.5(java.lang包)中定义的这个类扩展和实现

public abstract class Enum<E extends Enum<E>> {...
}..
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是创建自己的枚举类型,它具有不同的序数值.我不想通过使用不同的序数名称来实现它,比如getCode()等.所以我想我可以继续扩展上面的类.

public final class XYZ extends Enum<XYZ> { //Does not work.
  //
  A("A", 1),
  B("B", 7);
  .
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以做到以下几点:

public enum NEWEnum {
   A(1),
   B(7);

   private int code;
   private NEWEnum(int code) {
     this.code = code;
   }
   public int getCode() {
     return this.code;
   }
}
Run Code Online (Sandbox Code Playgroud)

我宁愿在Enum中使用通常的命令,如ordinal()和name().

Joe*_*ckx 5

你无法像这样扩展Enum.它内置于编译器或运行时(不确定是哪个).

但看起来你正试图解决错误的问题; 枚举值的序数不应该具有任何功能意义.只要你给它一个,它应该有一个不同于'Ordinal'的名字.您的第二个代码段远远优于您的第一个代码段.

一般来说,依靠序数来做任何事都是不好的做法; 它可能永远不应该首先暴露出来.您唯一可以依赖的是名称和您自己分配的任何价值.

如果你命名你的字段'序数'对你来说很重要,那么只需使用类型安全的枚举模式(第21项),这只是Enum的一个实现.