我偶然发现了这一点,想知道是否有 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);
}
}
正如预期的那样,此输出为 FRIDAY
。
如果我这样修改代码:
public class EnumTest {
public static void main(String[] args) {
methodThatDoesSomething(Days.FRIDAY.MONDAY);
}
public static void methodThatDoesSomething(Days day){
System.out.println(day);
}
}
此输出为 MONDAY
。
我也收到警告:
The static field Days.MONDAY should be accessed in a static way
但它仍然可以编译和运行。
任何有关何时可以使用此多重枚举引用的示例都将不胜感激。
最佳答案
这不是具体的枚举问题 - 它只是关于任何静态成员也(不幸的是)通过该类型的表达式有效。最常见的例子是:
Thread thread = new Thread(...);
thread.start();
thread.sleep(1000); // This doesn't do what it looks like
对于一个更接近你原来的非枚举例子,它基本上是这样的:
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;
}
}
请注意,即使 Foo.X
为 null,您也不会在此处获得空指针异常,尽管奇怪的是生成的代码确实仍然访问 Foo .X
在完全忽略它之前。好像是这样写的:
Foo ignored = Foo.X;
Foo foo = Foo.Y;
基本上,这是 Java 语言设计中的一个错误步骤,现在修复它为时已晚 - 我们能做的最好的事情就是收到警告,然后修复代码以通过类名访问静态成员。
关于java - 为什么 Java 在只识别最后一个时允许引用两个(或更多)枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924566/