Scala 3.5.0中case _不可达警告问题咨询(原3.4.2正常)
问题解析:Scala 3.5.0中match表达式的不可达分支警告问题
环境配置
使用Scala 3.5.0,编译选项如下:
-language:strictEquality -Yexplicit-nulls -Wsafe-init -explain -indent -new-syntax -Xfatal-warnings -Wunused:all -Wvalue-discard -Wnonunit-statement -Xcheck-macros -source future
问题代码及现象
以下代码编译时触发case _ =>不可达的致命警告:
import javax.swing.event.TreeSelectionEvent import javax.swing.tree.TreePath class testingCode: def process(t: TreeSelectionEvent) = val n = t.getNewLeadSelectionPath n match case tp: TreePath => case _ =>
将n match修改为(n: TreePath | Null) match后,代码可正常编译运行。经确认,Scala 3.4.2中无此问题,且查看Java源码可知getNewLeadSelectionPath确实可能返回null。
原因分析
这是Scala 3.5.0在特定编译选项组合下的兼容性问题:
- 开启
-Yexplicit-nulls和-source future后,Scala 3.5.0对Java互操作的类型推断逻辑发生了变化。 - Scala 3.4.2中,Java方法返回的引用类型会被默认推断为
T | Null(兼容Java的null语义),但Scala 3.5.0在-source future模式下,错误地将getNewLeadSelectionPath的返回类型推断为非空的TreePath,忽略了Java方法实际可能返回null的情况。 - 这种错误的类型推断导致编译器认为
n的类型不可能为null或其他类型,因此case _ =>分支被标记为不可达,触发致命警告。
结论
该问题属于Scala 3.5.0的版本回归bug,并非用户代码问题。通过显式指定类型TreePath | Null可以绕过该问题。
内容的提问来源于stack exchange,提问作者Karl S.
相关产品推荐
相关产品推荐

