Scala 3严格相等与显式null下Option模式匹配的正确处理方式
解决Scala 3严格相等下Option[Throwable]匹配的编译问题
在启用-language:strictEquality和-Yexplicit-nulls的Scala 3.2.2环境中,你当前的写法需要手动添加CanEqual实例才能编译,但有更规范简洁的处理方式:
推荐方案:使用标准Option模式匹配语法
直接匹配Some(c)而非类型检查,这是Scala处理Option的原生推荐写法,无需额外定义CanEqual:
val cause: Option[Throwable] = None cause match case Some(c) => c case None => null
这种写法既符合语言设计习惯,又完全规避了严格相等性带来的编译问题。
备选方案:针对None使用类型匹配
如果一定要保留类型检查的写法,可以将case None替换为case _: None.type,绕过CanEqual的检查:
val cause: Option[Throwable] = None cause match case c: Some[Throwable] => c.value case _: None.type => null
不过这种写法不如第一种直观,仅适合特定场景。
为什么手动派生CanEqual不是最优解
手动定义private given CanEqual[Option[Throwable], Option[Throwable]] = CanEqual.derived虽然能解决编译问题,但属于冗余操作——标准的模式匹配写法已经能完美处理这个场景,不需要额外引入CanEqual实例。
内容的提问来源于stack exchange,提问作者Karl S.
相关产品推荐
相关产品推荐

