在下面的示例中,如果我尝试通过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
,但我试图避免在这里使用类名称以方便和类型安全,因为此代码将在不同的地方重用。
答案 0 :(得分:4)
嵌套的
enum
类型是隐式静态的。这是允许的 声明嵌套的枚举类型以冗余地指定静态 改性剂。
无论如何,类型不是实例的成员。它(可能)是一种类型的成员。
正如规范所述,field access expression采用以下形式
<强> FieldAccess 强>:
Primary
. Identifier
super . Identifier
TypeName . super . Identifier
我们关心第一种情况,Primary
表达式。您必须通过其类型名称,通过其封闭类型的名称访问enum
常量。
你说
我可以使用Class1.EnumExample,但我试图避免使用该类&#39;为方便和类型安全而在这里命名,
与在源代码中使用类型名称相比,它的类型安全性更高。
Class
实例和类型名称是两个完全不同的东西。类型java.lang.Class
类似于任何其他类型(String
,List
,ExecutorService
等。它有其领域和方法。如果您的值为Class
,则可以使用它来访问这些成员。使用类型名称,您可以声明变量,可以声明类型参数,创建新实例(使用new
),并调用static
方法。