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

如何获取父类的类型参数?Scala泛型场景下的技术疑问

Scala宏中获取类的具体化父类型参数问题

问题场景

定义代码如下:

trait Foo[T]
class Bar extends Foo[String]

执行typeOf[Foo[String]].typeArgs能得到String;但执行typeOf[Bar].baseClasses.flatMap(_.typeArgs)却返回空集合。想知道是否无法获取给定类型对应的完整父类型?(补充:正在编写宏,仅关注编译时类型信息,不涉及实例)

解决方案

不是无法获取,问题出在baseClasses的作用逻辑上:

  • baseClasses返回的是原始的类/特质符号(比如这里的Foo本身,而非绑定了String的Foo[String]),原始符号本身没有绑定具体类型参数,所以它的typeArgs自然是空的。
  • 要拿到带具体类型参数的完整父类型,应该用Type.baseType方法:传入目标父类型的符号,就能获取到当前类型对应的具体化父类型实例。

示例代码

import scala.reflect.runtime.universe._

trait Foo[T]
class Bar extends Foo[String]

val barType = typeOf[Bar]
// 获取Foo特质的符号
val fooTraitSymbol = typeOf[Foo[_]].typeSymbol
// 获取Bar对应的具体化Foo父类型
val concreteFooType = barType.baseType(fooTraitSymbol)

// 此时就能拿到具体的类型参数
println(concreteFooType.typeArgs) // 输出: List(String)

宏中的用法

在宏逻辑里,只要拿到当前处理类型的Type实例,同样通过baseType定位到目标父类型的符号,就能获取到带完整参数的父类型,进而提取类型参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:18:14