2009-11-04 76 views
62

我有一個類定義這樣自己的枚舉:我怎麼可以參考我的Java枚舉沒有指定其類型

public class Test 
{ 
    enum MyEnum{E1, E2}; 

    public static void aTestMethod() { 
     Test2(E1); // << Gives "E1 cannot be resolved" in eclipse. 
    } 
    public Test2(MyEnum e) {} 
} 

如果我指定MyEnum.E1它工作正常,但我真的一樣將其作爲「E1」。任何想法我可以做到這一點,還是必須在另一個文件中定義這個工作?

結論: 我一直無法得到正確的導入語法。因爲有幾個答案表明這是可能的,所以我要選擇一個給我我需要的語法並且提升其他語法的答案。

順便說一句,這是一個真正的奇怪的部分(在我得到靜態導入工作之前),我寫的使用枚舉的switch語句不允許enum按其類型作爲前綴 - 所有其餘的代碼需要它。傷了我的頭。

+6

關於switch語句中的「非常奇怪的」行爲:Java在switch語句中的所有枚舉中都這樣做。既然你知道你打開的是什麼類型,他們認爲沒有理由讓你在每個大小寫塊中再次指定類型。 http://download.oracle.com/javase/tutorial/java/javaOO/enum.html – StriplingWarrior 2011-09-29 23:56:08

+1

我想我得到的是它不會允許枚舉類型前綴。其他任何前綴都是必需的(如果不導入)或可選的。 – 2014-04-04 16:25:35

+0

我同意你在提及'switch'不一致性時,會讓經驗較少的Java程序員刮目相看。 – jmarkmurphy 2015-09-23 14:07:18

回答

100

其實,你可以做一個嵌套枚舉的static import。下面的代碼編譯好:

package mypackage; 

import static mypackage.Test.MyEnum.*; 

public class Test 
{ 
    enum MyEnum{E1, E2}; 

    public static void aTestMethod() { 
     Test2(E1); 
    } 

    public static void Test2(MyEnum e) {} 
} 
+1

我暗示這是我的問題的解決方案,但我真的寧願不這樣做。枚舉僅在這一個文件中使用。這似乎很奇怪,這不僅僅是自動工作。 – 2009-11-04 22:23:20

+0

雖然您必須使用靜態導入,但您無需在自己的類中定義它。 – Yishai 2009-11-04 22:33:32

+0

我嘗試了幾種方式,並且無法正確引用靜態導入,因爲它引用了導入類中的類。 – 2009-11-04 22:39:48

13

您可以在一個嵌套類做靜態導入:

import static apackage.Test.Enum.*; 
4

測試類有一個包被定義爲可導入。

隨着Test定義包(IT WORKS):

package mypackage; 

您可以使用:

import static mypackage.Test.MyEnum.*; 

沒有包中定義的,則不能使用(不起作用):

import static Test.MyEnum.*;