为什么我不能从定义它的类的实例访问枚举?

时间:2014-12-18 21:20:38

标签: java enums

在下面的示例中,如果我尝试通过Class2中的Class1实例访问枚举,我会收到错误:“意外类型”:

public class Class1 {
    public enum EnumExample {
        ONE;
    }
}

public class Class2 {
    public Class2 {
        Class1 class1 = new Class1();
        Class1.EnumExample enumEx = class1.EnumExample.ONE;
    }
}

我可以使用Class1.EnumExample.ONE访问它,这让我相信我无法使用实例访问它,因为枚举是静态的,但我可以通过实例访问其他静态变量,所以必须有更多比那更好。

那么为什么会这样呢?


另外,我知道这可能应该是另一个问题,但我把它包括在这里作为一个旁边以防万一它是一个简单的答案:我是否有办法从一个实例访问枚举并仍然保持方便enum在IDE中的自动完成(在本例中为Netbeans)。

我试图从Class1中以静态方法返回枚举,希望利用我可以从其实例访问静态方法这一事实:

public static Class<EnumExample> getEnumExample() {
    return EnumExample.class;
}

但是当我在Class2上访问它时,Netbeans使用Class中的方法填充选项,而不是专门来自EnumExample

我可以使用Class1.EnumExample,但我试图避免在这里使用类名称以方便和类型安全,因为此代码将在不同的地方重用。

1 个答案:

答案 0 :(得分:4)

来自specification

  

嵌套的enum类型是隐式静态的。这是允许的   声明嵌套的枚举类型以冗余地指定静态   改性剂。

无论如何,类型不是实例的成员。它(可能)是一种类型的成员。

正如规范所述,field access expression采用以下形式

  

<强> FieldAccess

     
      
  • Primary . Identifier
  •   
  • super . Identifier
  •   
  • TypeName . super . Identifier
  •   

我们关心第一种情况,Primary表达式。您必须通过其类型名称,通过其封闭类型的名称访问enum常量。

你说

  

我可以使用Class1.EnumExample,但我试图避免使用该类&#39;为方便和类型安全而在这里命名,

与在源代码中使用类型名称相比,它的类型安全性更高。


Class实例和类型名称是两个完全不同的东西。类型java.lang.Class类似于任何其他类型(StringListExecutorService等。它有其领域和方法。如果您的值为Class,则可以使用它来访问这些成员。使用类型名称,您可以声明变量,可以声明类型参数,创建新实例(使用new),并调用static方法。