当调用具有相同类的常量的枚举构造函数时,编译器需要其限定名称,如下例所示:
enum Animal
{
CAT (MAMMAL), // this notation doesn't compile
LIZARD (Animal.REPTILE), // this one does
DOG (Animal.MAMMAL);
private static final int MAMMAL = 0;
private static final int REPTILE = 1;
private int family;
Animal(int family)
{
this.family = family;
}
}
不遵守会产生illegal forward reference
:编译器认为MAMMAL
是此枚举的一个实例,但此时尚未声明(如DOG
)而不是常量;鉴于没有构造函数接受Animal
类型的参数,这是荒谬的。
为什么编译器只有在使用语法MAMMAL
时才会检查Animal
是常量还是Animal.MAMMAL
的实例?