如何获取父类的类型参数?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
相关产品推荐
相关产品推荐

