如何在编译期获取类型擦除后的类型?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
相关产品推荐
相关产品推荐

