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
相关产品推荐
相关产品推荐

