我同意此代码:
var y = switch (0) {
case 0 -> '0';
case 1 -> 0.0F;
case 2 -> 2L;
case 3 -> true;
default -> 4;
};
System.out.println(y);
System.out.println(((Object) y).getClass().getName());
返回以下内容:
0
java.lang.Character
但是如果你删除布尔值:
var y = switch (0) {
case 0 -> '0';
case 1 -> 0.0F;
case 2 -> 2L;
default -> 4;
};
System.out.println(y);
System.out.println(((Object) y).getClass().getName());
返回以下内容:
48.0
java.lang.Float
我想这个结果是出乎意料的。
1条答案
按热度按时间hi3rlvi21#
根据switch表达式的JEP 325,switch表达式是一个多边形表达式:
switch表达式是poly表达式;如果目标类型是已知的,则该类型被下推到每个臂中。如果已知,则开关表达式的类型是其目标类型;如果不是,则通过组合每个案例臂的类型来计算独立类型。
因为您没有 target type,所以不会检查表达式是否匹配任何给定类型,这是预期的。
您可以通过将
var
替换为以下类型来验证这一点:在我的shell中,这将失败:
但是如果你删除布尔值:...
看一下独立类型是如何确定的就足够了(这里是规则):
独立开关表达式的类型确定如下:
据我所知,当你删除布尔表达式时,你只剩下数值表达式(
char
'0'
(int 48
)被提升为float
48.0
)。至于为什么
float
是结果的类型,请参见数值上下文部分。