我会尝试尽可能地脱口而出:
考虑界面:
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()
不返回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);
答案 0 :(得分:5)
使用以下循环来理解:
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
这意味着WARNING实际上是一个匿名类的实例,它扩展了MyEnum。 getInterfaces()只返回类声明实现的接口(即类声明的implements
子句中的接口)