我正在尝试实现(简化)特征的一个实例
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
但随后使用paramT
inq"... def apply[$paramT] ..."
确实会导致
java.lang.IllegalArgumentException: can't splice "A" as type parameter
所以这似乎也没有解决办法。