枚举:“非法前向引用”的一致性

Posted

技术标签:

【中文标题】枚举:“非法前向引用”的一致性【英文标题】:Enum: consistency of “illegal forward references” 【发布时间】:2015-09-18 21:58:42 【问题描述】:

当使用同一类的常量调用枚举构造函数时,编译器需要其限定名称,如下例所示:

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 类型的参数。

为什么编译器只在使用Animal.MAMMAL语法时才费力检查MAMMAL是常量还是Animal的实例?

【问题讨论】:

【参考方案1】:

可能是 java 编译器中的错误,如此处所述 forward reference

【讨论】:

以上是关于枚举:“非法前向引用”的一致性的主要内容,如果未能解决你的问题,请参考以下文章

为啥两个程序有前向引用错误而第三个没有?

枚举与 RawRepresentable 的一致性

通过扩展自动合成 Swift 结构或枚举的 Equatable 一致性

与枚举类型的属性的可解码一致性

哈希可枚举方法:仅传递一个参数时的行为不一致

枚举GC Roots的实现