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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:57:09