如何在不指定Java Enum类型的情况下引用我的Java Enum


83

我有一个定义自己的枚举的类,如下所示:

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”。您知道如何实现此目的,还是必须在另一个文件中定义它才能起作用?

结论:我无法正确获取导入的语法。由于有几个答案表明这是可能的,因此我将选择一个为我提供所需语法的文件,并对其他文件进行投票。

顺便说一下,这是一个真正的STRANGE部分(在我执行静态导入之前),我编写的使用enum的switch语句不允许enum以其类型为前缀-其余所有代码需要它。伤了我的头。


9
关于switch语句上的“非常奇怪”的行为:Java在switch语句上的所有枚举上都这样做。由于您知道要打开的类型,因此他们认为没有理由让您在每个case块中再次指定类型。download.oracle.com/javase/tutorial/java/javaOO/enum.html
StriplingWarrior

1
我想我得到的是它不允许Enum类型前缀。其他任何地方的前缀都是必需的(如果未导入)或可选的。
比尔K

对于switch不一致之处,我同意您的看法,这会使经验不足的Java程序员scratch之以鼻。
jmarkmurphy

Answers:


134

实际上,您可以静态导入嵌套枚举。下面的代码可以正常编译:

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
我提到这是我的问题的一种解决方案,但我真的不愿意这样做。枚举仅在此一个文件内使用。但这并不自动起作用,这似乎很奇怪。
比尔K

尽管您必须使用静态导入,但无需在其自己的类中对其进行定义。
Yishai

5
@Bill K,您为什么认为它应该自动运行?那么您希望它如何工作?A类{枚举B {X,Y};枚举C {X,Z}; }
Kevin Bourrillion 09年

2
仅因为MyEnum在Test外部可见,所以此解决方案有效。如果MyEnum是私有的,则解决方案将不起作用。
Chry Cheng 2013年

2
不要忘了最后一部分,“导入静态mypackage.Test.MyEnum。*;”中的符号“。*”。像我一样!
joro

17

您可以对嵌套类进行静态导入:

import static apackage.Test.Enum.*;

6

Test类必须在包中定义才能导入。

使用TestIT WORKS)中定义的包:

package mypackage;

您可以使用:

import static mypackage.Test.MyEnum.*;

如果没有定义包,则不能使用(DO NOT NOT WORK):

import static Test.MyEnum.*;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.