2009-11-04 73 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.*;