如何在Scala 3宏中定义返回this.type的细化类型?
Scala 3宏中创建含
this.type的细化类型问题 我正尝试在Scala 3宏中创建如下细化类型:
{ def foo: this.type }
注:我了解细化类型中的自引用已被弃用,但目前需要借此解决一些循环引用问题。
我目前能写出这样的代码:
Refinement(TypeRepr.of[Object], "foo", ???)
但如何获取this.type对应的TypeRepr呢?
我无法使用This(symbol),因为此处的细化类型没有对应的符号。
我尝试过用RecursiveType实现:
RecursiveType { parentExp => val resultType = This(parentExp.typeSymbol).tpe Refinement(TypeRepr.of[Object], "foo", resultType) }
但这会抛出ClassCastException,因为parentExp.typeSymbol不是类符号。
我是否需要创建newClassSymbol和TypeDef,再通过该符号来引用This,而非直接使用TypeRepr?
另外说明:我没有使用quotes,因为实际场景中成员并非提前可知,且据我所知无法拼接定义。
解决方案
你不需要手动创建类符号,正确的做法是直接利用RecursiveType的绑定变量指代递归的细化类型本身,而非通过This构造:
val refinedType = RecursiveType { self => Refinement(TypeRepr.of[Object], "foo", self) }
这里的self就是当前定义的细化类型的TypeRepr,直接将其作为foo的返回类型,完全等价于this.type的语义。
如果需要更贴近this.type的动态绑定特性,可以结合ThisType构造,但要注意符号类型的转换:
val refinedType = RecursiveType { self => val sym = self.typeSymbol.asInstanceOf[TypeSymbol] val thisType = ThisType(sym) Refinement(TypeRepr.of[Object], "foo", thisType) }
不过多数场景下第一种直接使用self的方式就足够满足需求,代码更简洁且避免类型转换的潜在问题。
内容的提问来源于stack exchange,提问作者steinybot
相关产品推荐
相关产品推荐

