Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写枚举方法时出现异常行为。getClass().getInterfaces()工作正常吗?_Java_Enums - Fatal编程技术网

Java 重写枚举方法时出现异常行为。getClass().getInterfaces()工作正常吗?

Java 重写枚举方法时出现异常行为。getClass().getInterfaces()工作正常吗?,java,enums,Java,Enums,我会尽量简明扼要: 考虑接口: package com.stackoverflow; public interface Printable { void print(); } 我创建了一个实现这个接口的枚举。到目前为止一切顺利: public enum MyEnum implements Printable { ERROR, WARNING, SUCCESS; @Override public void print() { System.out.pr

我会尽量简明扼要:

考虑接口:

package com.stackoverflow;

public interface Printable {
  void print();
}
我创建了一个实现这个接口的枚举。到目前为止一切顺利:

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

   @Override
   public void print() {
     System.out.println("Printed: " +this.name());
   }
}
我用以下行创建了一个
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()); 
一切正常,对吗?现在来看看奇怪的部分:

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());
 }
}
问题:

为什么,重写
print
方法会使
enumInstance.getClass().getInterfaces()
不返回可打印的?在上面的示例中,我知道WARNING now是匿名类的一部分,但是
getInterfaces
不应该返回声明的接口(在这种情况下可打印)


使用以下循环来理解:

public static void main(String[] args) {
    for (MyEnum e : MyEnum.values()) {
        System.out.println(e + ".getClass() = " + e.getClass());
    }
}
它将打印:

ERROR.getClass() = class com.stackoverflow.MyEnum
WARNING.getClass() = class com.stackoverflow.MyEnum$1
SUCCESS.getClass() = class com.stackoverflow.MyEnum

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

使用以下循环来理解:

public static void main(String[] args) {
    for (MyEnum e : MyEnum.values()) {
        System.out.println(e + ".getClass() = " + e.getClass());
    }
}
它将打印:

ERROR.getClass() = class com.stackoverflow.MyEnum
WARNING.getClass() = class com.stackoverflow.MyEnum$1
SUCCESS.getClass() = class com.stackoverflow.MyEnum
这意味着警告实际上是一个匿名类的实例,它扩展了MyEnum。和getInterfaces()只返回类declaresto要实现的接口(即类声明的
实现的
子句中的接口)