为什么在java的switch case中枚举常量必须是不限定的?



一点背景信息。这是关于开关情况下限定enum名称的问题,例如:

enum MyEnum {
A,
B,
;
}
switch(methodReturnungMyEnum()){
case MyEnum.A:
// ...
break
case MyEnum.B:
// ...
break
}

产生编译错误

枚举开关箱标签必须是枚举常量的非限定名

是的。解决方法很简单:移除MyEnum.部分。这不是我的问题。

我只是想知道为什么这是禁止的首先。我知道基本上不可能明确地回答为什么以某种方式做某事。相反,我想问一下可能导致这个决定的原因。限定和非限定枚举常量(或者一般的符号)在哪些方面不同?如果编译器允许这样做,又会出什么问题呢?

虽然有很多关于如何修复编译器错误本身的问题,但似乎没有人解决上述问题。

真正的枚举类型定义在switch句中,对于每个case子句,编译器只需要检查该枚举中是否存在字面量。

如果您允许在case子句中指定限定符(完全限定符等),那么编译器必须执行一个无用的步骤(检查该符号是否是给定枚举的成员)。

这就是为什么把它和not放在一起是不一样的原因(乍看起来可能是这样)。

从技术上讲,这个限制在这里响应,在这里解释。

最新更新