为什么当只识别最后一个时,Java允许引用两个(或更多)枚举?

fer*_*ley 1 java enums

我偶然发现了这一点,并且想知道java是否允许它.

这是我的意思的样本:

public enum Days {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}

public class EnumTest {

    public static void main(String[] args) {

        methodThatDoesSomething(Days.FRIDAY);
    }

    public static void methodThatDoesSomething(Days day){

        System.out.println(day);
    }
}
Run Code Online (Sandbox Code Playgroud)

FRIDAY正如预期的那样,输出就是这样.

如果我像这样更改代码:

public class EnumTest {

    public static void main(String[] args) {

        methodThatDoesSomething(Days.FRIDAY.MONDAY);
    }

    public static void methodThatDoesSomething(Days day){

        System.out.println(day);
    }
}
Run Code Online (Sandbox Code Playgroud)

这个输出是MONDAY.

我也收到警告:

应以静态方式访问静态字段Days.MONDAY

但它仍然编译和运行.

任何可以使用这个多枚举参考的例子都将非常感激.

Jon*_*eet 9

这不是一个特别的问题 - 它只是关于任何静态成员(不幸的是)通过该类型的表达式有效.最常见的例子是:

Thread thread = new Thread(...);
thread.start();
thread.sleep(1000); // This doesn't do what it looks like
Run Code Online (Sandbox Code Playgroud)

对于更接近原始的非枚举示例,它基本上是这样的:

class Foo {
   public static final Foo X = null;
   public static final Foo Y = new Foo();
}

public class Test {
    public static void main(String[] args) {
        Foo foo = Foo.X.Y;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,即使Foo.X是空,你没有得到一个空指针异常这里,虽然奇怪生成的代码确实仍然获得Foo.X完全无视它.好像它是写的:

Foo ignored = Foo.X;
Foo foo = Foo.Y;
Run Code Online (Sandbox Code Playgroud)

基本上,这是Java语言设计中的错误步骤,现在修复它已经太晚了 - 我们能做的最好的事情是获取警告,然后修复代码以通过类名访问静态成员.