我正在尝试实现(简化)特征的一个实例
trait TC[F[_]] {
def apply[A](fa: F[A]): F[A]
}
使用 Scala 宏。因此,宏的签名是
def materialize[F[_]](c: Context)(
implicit fT: c.WeakTypeTag[F[_]]): c.Expr[TC[F]]
现在需要将类型构造函数F[_]应用于类型参数A,原因有两个:
apply为特定的F(如Foo[A])写上面的签名- 检查类型的成员
Foo[A]以指定有趣的主体apply
有什么方法可以创建与方法类型参数对应的类型A,而不是使用appliedType?这对我来说似乎很困难,因为该方法apply及其类型参数A也只是作为树生成的。
我试图将WeakTypeTag[TC[F]]宏调用的附加参数作为附加参数,并通过以下方式接收参数类型
val paramT = wfg.tpe.member("apply": TermName).tpe.typeParams.head.tpe
但随后使用paramTinq"... def apply[$paramT] ..."确实会导致
java.lang.IllegalArgumentException: can't splice "A" as type parameter
所以这似乎也没有解决办法。