[英]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.