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我以前从未听说过间接导入。需要详细说明吗?@DoubleMMyEnum
是在它自己的文件中定义的,而不是一个静态的内部类。如果你导入一个类,你基本上会告诉编译器你要使用哪个类。如果始终使用完全限定的类名,如new stackoverflow.models.MyPojo()
,则根本不必进行任何导入。也就是说,编译器知道如何导入特定范围内所需的类,并且因为它知道MyPojo
使用MyEnum
,它也会在内部“导入”该类。有趣的是,它只是需要一个“简单的名称”。谢谢你的链接。简单的名称就是枚举常量的名称。这里的关键概念是该常数声明的范围。