Scala宏对样例类的类型参数自省泛型映射问题
Scala 2 宏泛型样例类参数映射解决方案
- 问题本质:你从样例类声明处拿到的
typeSignature里的泛型是原始定义的形参(即定义Foo时声明的Bar),而你持有的tpe是实际传入的参数化类型,二者只需要做形参到实参的绑定替换即可解决。 - 具体实现步骤:
- 提取泛型形参列表:从实际类型的构造器中获取原始定义的所有泛型形参符号,顺序和定义顺序完全一致
val typeParams = tpe.typeConstructor.typeParams - 提取泛型实参列表:从实际参数化类型中提取传入的所有真实泛型参数,顺序和形参列表一一对应
val typeArgs = tpe.typeArgs - 替换签名中的形参:使用Scala 2 宏原生提供的
substituteTypes方法,直接完成签名中所有形参到实参的递归替换// originalSig 是你拿到的包含泛型形参Bar的原始typeSignature val resolvedSig = originalSig.substituteTypes(typeParams, typeArgs)
- 提取泛型形参列表:从实际类型的构造器中获取原始定义的所有泛型形参符号,顺序和定义顺序完全一致
- 验证:替换完成后的
resolvedSig中所有原本的泛型形参Bar会被替换为实际传入的Baz,符合预期。
该方法对样例类字段类型、方法返回值/参数类型等所有引用类泛型形参的类型场景均适用,无需手动递归处理嵌套的泛型引用。
内容的提问来源于stack exchange,提问作者darkfrog
相关产品推荐
相关产品推荐

