覆盖枚举方法时的奇怪行为.getClass().getInterfaces()是否正常工作?

Mar*_*des 1 java enums

我会尝试尽可能地作为succint:

考虑界面:

package com.stackoverflow;

public interface Printable {
  void print();
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个实现此接口的枚举.到现在为止还挺好:

public enum MyEnum implements Printable {
  ERROR,
  WARNING, 
  SUCCESS;

   @Override
   public void print() {
     System.out.println("Printed: " +this.name());
   }
}
Run Code Online (Sandbox Code Playgroud)

main用以下几行创建了一个方法:

//OK! Prints 1
System.out.println(ERROR.getClass().getInterfaces().length); 

//OK! Prints "Printable" (the name of the interface).       
System.out.println(ERROR.getClass().getInterfaces()[0].getSimpleName()); 
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作,对吧?现在到了奇怪的部分:

public enum MyEnum implements Printable {
  ERROR,
  WARNING{

   //Notice the "@Override", that means that I'm overriding a superclass/interface method! No compiler errors!
   @Override
   public void print() {
     System.out.println("I'm not printable anymore!");
   }
 },
 SUCCESS;

 @Override
 public void print() { 
   System.out.println("Printed: " +this.name());
 }
}
Run Code Online (Sandbox Code Playgroud)

题:

为什么,重写该print方法enumInstance.getClass().getInterfaces()不会返回Printable?在上面的例子中,我知道WARNING现在是匿名类的一部分,但是getInterfaces不应该返回声明的接口(在本例中为Printable)?

//OK! Prints 1
System.out.println(ERROR.getClass().getInterfaces().length); 
//NOT OK! Prints 0
System.out.println(WARNING.getClass().getInterfaces().length); 
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 5

使用以下循环来理解:

public static void main(String[] args) {
    for (MyEnum e : MyEnum.values()) {
        System.out.println(e + ".getClass() = " + e.getClass());
    }
}
Run Code Online (Sandbox Code Playgroud)

它将打印:

ERROR.getClass() = class com.stackoverflow.MyEnum
WARNING.getClass() = class com.stackoverflow.MyEnum$1
SUCCESS.getClass() = class com.stackoverflow.MyEnum
Run Code Online (Sandbox Code Playgroud)

这意味着WARNING实际上是一个匿名类的实例,它扩展了MyEnum.getInterfaces()只返回类声明实现的接口(即implements类声明子句中的接口)