[英]Why can't I access an enum from an instance of the class where it's defined?
在下面的示例中,如果尝试通过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
来访问它,这使我相信我不能使用实例来访问它,因为枚举是静态的,但是我可以通过该实例访问其他静态变量,因此它必须比那。
那么为什么会这样呢?
另外,我知道这可能应该是另一个问题,但是我将其作为一个简单的答案放在了一边:我是否可以通过某种方式从实例访问枚举,并且仍然保持枚举自动的便利性IDE中的-completion(在这种情况下为Netbeans)。
我试图从Class1的静态方法中返回枚举,希望利用我可以从其实例访问静态方法的事实:
public static Class<EnumExample> getEnumExample() {
return EnumExample.class;
}
但是,当我在Class2上访问它时,Netbeans会使用Class
方法而不是EnumExample
方法来填充选项。
我可以只使用Class1.EnumExample
,但是为了方便起见和类型安全,我试图避免在这里使用类的名称,因为此代码将在不同的地方重用。
从规格
嵌套
enum
类型是隐式静态的。 允许嵌套枚举类型的声明多余地指定static修饰符。
无论如何,类型不是实例的成员。 它是(可能是)类型的成员。
如规范所述, 字段访问表达式采用以下形式
FieldAccess :
Primary
. Identifier
. Identifier
super . Identifier
TypeName . super . Identifier
我们关心第一种情况,带有Primary
表达式。 您必须通过其类型名称,通过其封闭类型的名称来访问enum
常量。
你说
我可以只使用Class1.EnumExample,但是为了方便起见和类型安全,我试图避免在这里使用类的名称,
没有比在源代码中使用类型名称更安全的类型。
Class
实例和类型名称是完全不同的两件事。 类型java.lang.Class
与其他类型( String
, List
, ExecutorService
等)一样。 它具有其领域和方法。 如果您具有Class
类型的值,则可以使用它来访问那些成员。 使用类型名称,您可以声明变量,可以声明类型参数,创建新实例(使用new
),并调用static
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.