Java 17:为何switch语句可编译,switch表达式却无法编译?
为什么两段switch代码编译结果不同?
第一段代码能编译的原因
第一段里的switch是switch语句,它被放在返回double类型的方法中:
- 每个
case分支要么返回一个double值,要么抛出异常,完全满足方法的返回类型要求; - 调用
getResult(s)后,返回的double值会被var自动推断为double类型,所以整个代码能正常编译。
对应的代码:
var res = getResult(s); public static double getResult(Shape s) { switch(s) { case Rectangle r : return 2* r.largeur() + 2* r.longueur(); case Circle c : return 2*c.radius(); default : throw new RuntimeException("not a shape"); } }
第二段代码编译失败的原因
第二段是把switch直接作为表达式赋值给var,这时候它属于switch表达式,和switch语句的语法规则完全不同:
- switch表达式的分支不能用
return来提供返回值——return是用来退出当前方法/代码块的,不是给表达式生成值; - 正确的写法应该用
->直接返回值,或者用yield关键字在代码块中返回值。
你原来的写法违反了switch表达式的语法,所以编译器报错。
第二段代码的修正版本
用->简化写法:
var res = switch(s) { case Rectangle r -> 2* r.largeur() + 2* r.longueur(); case Circle c -> 2*c.radius(); default -> throw new RuntimeException("not a shape"); };
或者用代码块加yield的写法:
var res = switch(s) { case Rectangle r : { yield 2* r.largeur() + 2* r.longueur(); } case Circle c : { yield 2*c.radius(); } default : throw new RuntimeException("not a shape"); };
内容的提问来源于stack exchange,提问作者AntonBoarf
相关产品推荐
相关产品推荐

