含高阶类型WeakTypeTag的Scala宏编译错误如何修复?
Scala宏编译错误修复方案
错误原因
原代码中c.WeakTypeTag[Alg[_]]的写法存在类型不匹配:
Alg被声明为接受带一个类型参数的类型构造器(即Alg[_[_]]),但Alg[_]里的_是普通无参数类型,不符合Alg的参数要求,因此编译器抛出_$2 takes no type parameters, expected: 1错误。
修复方法
根据实际需求,有三种可行修复方式:
方式一:传入具体的高阶类型参数
若需要为Alg指定明确的单参数类型构造器,可调整代码如下:
def someMacro[Alg[_[_]], F[_]](c: Context)(implicit alg: c.WeakTypeTag[Alg[F]])
这里引入F[_]作为符合要求的类型构造器参数,匹配Alg的输入要求。
方式二:使用通配符高阶类型
若不需要具体的类型构造器,直接用通配符表示任意单参数类型构造器,修改类型标签写法:
def someMacro[Alg[_[_]]](c: Context)(implicit alg: c.WeakTypeTag[Alg[_[_]]])
Alg[_[_]]中的_[_]是符合Alg参数要求的高阶类型,编译器可正确识别。
方式三:获取Alg自身的类型标签(按需选择)
若需求是获取Alg这个高阶类型构造器本身的类型标签,而非它应用后的类型,可简化为:
def someMacro[Alg[_[_]]](c: Context)(implicit alg: c.WeakTypeTag[Alg])
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

