Scala 3 传入Wrapper("yo")报No singleton value错误是预期行为吗
Scala 3 单例类型编译问题分析
问题现象
编译失败抛出的错误信息如下:
No singleton value available for A
where: A is a type variable with constraint >: ("yo" : String) and <: Singleton
问题代码示例:
case class Wrapper[A <: Singleton](a: A)(using ValueOf[A]) def test[A <: Singleton](blabla: Wrapper[A]): Unit = () test(Wrapper("yo"))
将Wrapper("yo")提取为独立变量后即可正常编译:
case class Wrapper[A <: Singleton](a: A)(using ValueOf[A]) def test[A <: Singleton](blabla: Wrapper[A]): Unit = () val value = Wrapper("yo") test(value)
结论
这是Scala 3的预期行为,不属于Bug,差异来自Scala 3类型推断规则在不同上下文下的处理逻辑。
原因说明
- 直接嵌套传参的场景:当
Wrapper("yo")作为参数直接传入test时,编译器会先从test的参数定义做反向类型推导,此时Wrapper的类型参数A会被临时推断为一个带有上下界的未确定类型>: "yo" <: Singleton,而非确定的单例类型"yo"。而ValueOf类型类的自动给定实例仅能针对确定的单例类型生成,这种未定型的中间类型没有对应的ValueOf实例,因此编译报错。 - 提取为val的场景:当
Wrapper("yo")被绑定到一个独立val时,没有外部的反向类型推导约束,编译器会直接根据入参"yo"将A推断为确定的单例类型"yo",此时可以自动生成ValueOf["yo"]实例,因此编译正常。
替代解决方案
如果不想提取独立变量,可以手动指定Wrapper的类型参数即可编译通过:
test(Wrapper["yo"]("yo"))
内容的提问来源于stack exchange,提问作者Fabio Epifani
相关产品推荐
相关产品推荐

