簡體   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