如何使用附加接口扩展 Enum?

mem*_*und 1 java enums

我有一个来自另一个我无法更改的库的现有枚举,如下所示:

    enum PersonTypes {
       ADT("Adult"), CHD("Child"), INF("Infant");
    
       private String value;
       PersonTypes(String value) { this.value = value; }
    }
Run Code Online (Sandbox Code Playgroud)

我想用一个接口增强枚举,以便提供一些功能。当然,下面的代码是无效的,但展示了我想要实现的目标:

    enum PrintablePersonTypes implements Printable {
       PersonTypes.ADT, PersonTypes.CHD, PersonTypes.INF;
    
       @Override
       public void printme() {
            sysout("I'm a " + super.value);
       }
    }
Run Code Online (Sandbox Code Playgroud)

晚安喜欢:

List<PrintablePersonTypes> list;
list.stream.forEach(p -> o.printme());
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

Hul*_*ulk 6

我认为这对枚举是不可能的。由于枚举是“隐式最终的”,并且“枚举常量定义了枚举类型的实例” JLS 8.9,因此您既不能使用继承也不能定义不同类型的枚举常量。

我能想到的最接近的事情是

enum PrintablePersonTypes implements Printable {
   ADT(PersonTypes.ADT),
   CHD(PersonTypes.CHD), 
   INF(PersonTypes.INF);

   private PersonTypes pt;

   private PrintablePersonTypes(PersonTypes pt) {
       this.pt = pt;
   }

   @Override
   public void printme() {
        sysout("I'm a " + pt.value);
   }
}
Run Code Online (Sandbox Code Playgroud)

即通过成员显式创建映射。