为什么枚举常量在 java 的 switch case 中必须是非限定的?
Why must enum constants be unqualified in switch cases in java?
一些上下文。这是关于 switch cases 中限定枚举名称的问题,如示例所示:
enum MyEnum {
A,
B,
;
}
switch(methodReturnungMyEnum()){
case MyEnum.A:
// ...
break
case MyEnum.B:
// ...
break
}
产生编译器错误
An enum switch case label must be the unqualified name of an enumeration constant
是的。解决方案很简单:删除 MyEnum.
部分。那不是我的问题。
我只是想知道 为什么这首先被禁止。
我知道基本上不可能肯定地回答 为什么 某事是以某种方式完成的。相反,我想询问可能导致此决定的原因。合格和不合格的枚举常量(或一般符号)有何不同?如果编译器允许这样做,会出现什么问题?
虽然存在很多关于如何修复编译器错误本身的问题,但似乎没有人解决上述问题。
真正的枚举类型被定义到 switch
语句中,然后,对于每个 case
子句,编译器只需要检查该枚举中是否存在文字。
如果您允许在 case
子句中指定限定(完全限定等...),则编译器必须执行一个无用的步骤(检查该符号是给定枚举的成员).
这就是为什么说它不是(乍一看可能是这样)的原因。
从技术上讲,该限制已得到响应 here and explained here。
一些上下文。这是关于 switch cases 中限定枚举名称的问题,如示例所示:
enum MyEnum {
A,
B,
;
}
switch(methodReturnungMyEnum()){
case MyEnum.A:
// ...
break
case MyEnum.B:
// ...
break
}
产生编译器错误
An enum switch case label must be the unqualified name of an enumeration constant
是的。解决方案很简单:删除 MyEnum.
部分。那不是我的问题。
我只是想知道 为什么这首先被禁止。 我知道基本上不可能肯定地回答 为什么 某事是以某种方式完成的。相反,我想询问可能导致此决定的原因。合格和不合格的枚举常量(或一般符号)有何不同?如果编译器允许这样做,会出现什么问题?
虽然存在很多关于如何修复编译器错误本身的问题,但似乎没有人解决上述问题。
真正的枚举类型被定义到 switch
语句中,然后,对于每个 case
子句,编译器只需要检查该枚举中是否存在文字。
如果您允许在 case
子句中指定限定(完全限定等...),则编译器必须执行一个无用的步骤(检查该符号是给定枚举的成员).
这就是为什么说它不是(乍一看可能是这样)的原因。
从技术上讲,该限制已得到响应 here and explained here。