Java 打开枚举时不导入类

Java 打开枚举时不导入类,java,Java,假设我有一个枚举,如下所示: package stackoverflow.models; public enum MyEnum { VALUE_1, VALUE_2; } 然后我有一个POJO,它将这个枚举作为它的一个字段: package stackoverflow.models; public class MyPojo { private MyEnum myEnum; public MyEnum getMyEnum() { return

假设我有一个枚举,如下所示:

package stackoverflow.models;

public enum MyEnum {
    VALUE_1,
    VALUE_2;
}
然后我有一个POJO,它将这个枚举作为它的一个字段:

package stackoverflow.models;

public class MyPojo {
    private MyEnum myEnum;

    public MyEnum getMyEnum() {
        return myEnum;
    }

    public void setMyEnum(MyEnum myEnum) {
        this.myEnum = myEnum;
    }
}
现在,如果我在
MyPojo.getMyEnum()
上执行
开关
,我不需要将枚举直接导入到我的类中:

package stackoverflow.classes;

import stackoverflow.models.MyPojo;

public class MyClass {
    public static void main(final String... args) {
        final MyPojo pojo = new MyPojo();
        switch(pojo.getMyEnum()) {
        case VALUE_1:
            break;
        case VALUE_2:
            break;
        default:
            break;
        }
    }
}

我只是想知道为什么会这样?如果Java不直接导入枚举,它如何解析枚举值?

它不是枚举类型本身,而是枚举常量,其中范围包括
开关
语句的
大小写
标签,如中所述:

声明的范围是程序的区域,在该区域内,声明所声明的实体可以使用简单的名称引用,前提是它是可见的(§6.4.1)

在枚举类型T中声明的枚举常量C的范围是T的主体,以及表达式为枚举类型T(§14.11)的
switch
语句的任何大小写标签


嗯,它间接导入枚举,因为它由
MyPojo
类使用(由于两者位于同一个包中,因此不需要导入)。在这种情况下,枚举是在另一个类(MyPojo)内部定义的,其行为类似于静态内部类。所以,您的问题的答案是:当您导入类时,您还导入了它的所有内部类和枚举。如果枚举是在单独的文件中定义的,则必须显式导入它或使用完全限定名(例如org.mynamespace.MyEnum)@Thomas我以前从未听说过间接导入。需要详细说明吗?@DoubleM
MyEnum
是在它自己的文件中定义的,而不是一个静态的内部类。如果你导入一个类,你基本上会告诉编译器你要使用哪个类。如果始终使用完全限定的类名,如
new stackoverflow.models.MyPojo()
,则根本不必进行任何导入。也就是说,编译器知道如何导入特定范围内所需的类,并且因为它知道
MyPojo
使用
MyEnum
,它也会在内部“导入”该类。有趣的是,它只是需要一个“简单的名称”。谢谢你的链接。简单的名称就是枚举常量的名称。这里的关键概念是该常数声明的范围。