JDK 19模式匹配Switch编译失败问题咨询
JDK 19预览版模式匹配编译失败,JDK 17却能正常运行?
我尝试使用JDK 19预览版的模式匹配功能编写了如下示例代码:
static String asString(Object value) { return switch (value) { case String s && s.length() > 10 -> "bigger then 10 : " + s; case String s -> "less then 10 " + s; case Collection<?> c -> "collection : " + c; case null -> "null"; default -> value.toString(); }; }
令我意外的是,这段代码在JDK 19中编译失败,但在JDK 17中可正常运行。请问这是有意的变更还是一个小Bug?
编译报错信息
One.java:13: error: : or -> expected case String s && s.length() > 10 -> "bigger then 10 : " + s; ^ One.java:13: error: illegal start of expression case String s && s.length() > 10 -> "bigger then 10 : " + s; ^ One.java:13: error: ';' expected case String s && s.length() > 10 -> "bigger then 10 : " + s; ^ One.java:13: error: not a statement case String s && s.length() > 10 -> "bigger then 10 : " + s; ^ Note: One.java uses preview features of Java SE 19. Note: Recompile with -Xlint:preview for details. 4 errors
JDK版本信息
openjdk version "19" 2022-09-20 OpenJDK Runtime Environment (build 19+37) OpenJDK 64-Bit Server VM (build 19+37, mixed mode, sharing)
这是有意的语法变更,并非Bug。JDK 17中的模式匹配switch是预览特性,当时允许用&&连接模式和守卫条件;但到了JDK 19,模式匹配switch的语法进行了调整,守卫条件必须通过when子句来声明,这是特性演进过程中的语法规范优化。
修正后的代码如下:
static String asString(Object value) { return switch (value) { case String s when s.length() > 10 -> "bigger then 10 : " + s; case String s -> "less then 10 " + s; case Collection<?> c -> "collection : " + c; case null -> "null"; default -> value.toString(); }; }
内容的提问来源于stack exchange,提问作者Eugene
相关产品推荐
相关产品推荐

