我有以下代码(我知道它不好 ;)):
public class Clazz1 {
public int test = 10;
public enum test {a, s, d, f }
void sth() {
// ...
}
}
有什么方法可以访问这个枚举吗?当我键入“test”时,它总是表示 int 变量。与这种情况相关的规则是什么 - 为什么编译器甚至允许 enum 和 int 具有相同的名称?
最佳答案
public class Clazz1 {
public int test = 10;
public enum test {a, s, d, f };
public static void main() {
System.out.println("a: " + Clazz1.test.a);
}
}
什么时候运行
$ javac Clazz1.java
Clazz1.java:8: error: non-static variable test cannot be referenced from a static context
System.out.println("a: " + Clazz1.test.a);
^
Clazz1.java:8: error: int cannot be dereferenced
System.out.println("a: " + Clazz1.test.a);
^
枚举实际上是特殊的类类型,使用 enum 关键字会导致创建类。例如:
import java.util.Arrays;
import static java.lang.System.out;
public class Clazz1 {
public enum test
{
a, b, c, d, e, f;
};
public static int test = 10;
public static void main(String[] args) {
Class<?> ec = Clazz1.test.class;
out.format("Name: %s, constants: %s%n\n", ec.getName(),
Arrays.asList(ec.getEnumConstants()));
}
}
您现在可以使用 ec 和 Enum 类方法来获取实体。问题是你真的不想这样做。因为它相当于:
class Foo {
class Bar { }
int Bar;
}
这将使 javac 吐出不需要的墓志铭。
有关枚举反射类的更多信息,请查看 java api 文档
关于java - 枚举和变量的名称相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7868995/