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

Scala 3中如何将T | Option[T]联合类型归一化为Option[T]?

推荐方案1:使用重载构造方法(最优,无任何类型问题)

直接放弃参数的Union类型定义,通过伴生对象重载apply方法实现相同的调用体验,同时原生拿到归一化后的Option[T]类型,完全规避类型擦除带来的运行时检查问题:

case class Example[T](obj: Option[T] = None)

object Example:
  // 支持直接传入T类型实例构造
  def apply[T](obj: T): Example[T] = Example(Some(obj))

使用方式和你原来的实现完全一致:

  • 传普通对象:Example(myObject)
  • 传Option:Example(Some(myObject)) / Example(None)
    不需要额外写任何匹配转换逻辑,obj字段本身就是Option[T]类型,可直接使用。

方案2:保留Union类型定义的简化写法

如果一定要保留Union类型的参数定义,可以通过结构匹配避开泛型类型检查,不需要引入复杂的TypeTest逻辑:

case class Example[T](
    obj: Option[T] | T = None,
):
  lazy val maybeIn = obj match
    case None => None
    case Some(o) => Some(o)
    case o: T @unchecked => Some(o)

这里直接匹配None和Some的字面结构,不会触发对Option[T]的泛型类型检查,剩下的分支必然是T类型,加@unchecked注解即可消除编译器告警,逻辑上已经覆盖了所有可能的输入情况。

内容的提问来源于stack exchange,提问作者pme

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:06:04