繁体   English   中英

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

[英]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与其他类型( StringListExecutorService等)一样。 它具有其领域和方法。 如果您具有Class类型的值,则可以使用它来访问那些成员。 使用类型名称,您可以声明变量,可以声明类型参数,创建新实例(使用new ),并调用static方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM