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

为何Scala中使用opaque type作为derives类型编译失败?

问题解答

核心原因:Scala derives 对类型的硬性要求

derives 关键字要求后面必须跟类或特质类型——这个语法的本质是让编译器自动生成对应类型类的实例,只有类/特质才能作为这种“可派生类型类”的载体。

第一个代码编译失败的原因

opaque type Global[Value] = Unit
object Global:
  def derived[Value]: Global[Value] = ()

case class Yo() derives Global

这里的Global是不透明类型(opaque type),本质是对Unit的类型别名(仅隐藏底层实现细节),它根本不属于类类型,完全不符合derives的类型要求,因此编译器直接报错“Global is not a class type”。哪怕伴生对象有derived方法也没用,因为第一步的类型检查就无法通过。

第二个代码能编译的原因

case class Global[Value]()
object Global:
  def derived[Value]: Global[Value] = Global()

case class Yo() derives Global

这里的Global是一个case class,属于合法的类类型,满足derives的前置要求。同时伴生对象提供了derived方法来生成Global[Value]的实例,完全符合Scala类型类派生的规则,因此编译器可以正常处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:03:11