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

如何在编译期获取类型擦除后的类型?Scala3中从TypeRepr获取擦除Type的方法

Scala 3 获取TypeRepr擦除后类型的方案

在Scala 2中我们通过TypeApi#erasure获取类型擦除后的结果,Scala 3针对TypeRepr实例提供了语义完全一致的对应方法,直接调用即可。
官方对该方法的语义描述和Scala 2完全一致:

返回Scala到Java的所有转换执行完成后,与当前类型对应的擦除后类型。

核心调用方法

直接调用TypeRepr实例的erasedType方法即可,返回值就是擦除后的TypeRepr实例,你可以后续调用asType方法转成你需要的Type类型。

代码示例

import scala.quoted.*

// 示例:在宏实现中获取指定类型的擦除后Type实例
inline def getErasedType[T]: Type[?] = ${getErasedTypeImpl[T]}

private def getErasedTypeImpl[T: Type](using Quotes): Expr[Type[?]] =
  import quotes.reflect.*
  // 拿到原始类型的TypeRepr实例
  val originalType: TypeRepr = TypeRepr.of[T]
  // 获取擦除后的TypeRepr
  val erasedTypeRepr: TypeRepr = originalType.erasedType
  // 转成Type类型返回
  erasedTypeRepr.asType match
    case '[et] => Expr(Type.of[et])

补充说明

  • 该方法严格遵循JVM类型擦除规则,泛型参数、通配符、高阶类型都会被擦除到对应的声明上界,无显式上界则擦除为java.lang.Object
  • 如果需要直接获取擦除后对应的Java Class对象,可在拿到擦除后的TypeRepr实例后调用classSymbol获取类符号,再通过全限定名加载Class即可,不需要额外手动处理类型映射。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 19:15:04