You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:12:10