java - 枚举和变量的名称相同

标签 java

我有以下代码(我知道它不好 ;)):

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/

相关文章:

java - Spring Binding List<Object> 到 Form :checkboxes

Apache Pivot 网站上的此浏览器不支持 Java 插件

java - 如何在 Spring Batch : Updated 中循环运行步骤

java - MongoDB 和 JAVA - 带有正则表达式查询的逻辑或

java - 为 Java 中的任意对象生成 Java 字面量语法

java - 单击按钮时发出一个 url,它作为后台进程运行

java - 暂停/恢复线程中的任意计算

java - android客户端之间实时通信的最佳方式是什么?

java - 从 DateTime 对象获取 LocalDateTime

java - 如何使用 Spring 注入(inject)带有变音符号的属性?