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

