我正在尝试实现一个宏,该宏返回类型为XX
的类T
的子类型。显而易见的实现无法编译,可能是由于Scala弱类型推断。
最小示例:
def foo[T, X <: XX[T]](x: X): X = macro fooMacro[T, X]
def fooMacro[T, X<: XX[T]](c: Context)(x: c.Expr[X]): c.Expr[X] = ...
错误消息:
Error:(9, 11) macro implementation has incompatible shape: ...
type arguments [Nothing,X] do not conform to method fooMacro type parameter bounds [T,X<: XX[T]]>
是否可以解决此问题?
答案 0 :(得分:2)
尝试用隐式类型约束替换类型绑定。以下代码编译
import scala.language.experimental.macros
import scala.reflect.macros.blackbox
trait XX[_]
object Macro {
def foo[T, X](x: X)(implicit ev: X <:< XX[T]): X = macro fooMacro[T, X]
def fooMacro[T: c.WeakTypeTag, X: c.WeakTypeTag](c: blackbox.Context)(x: c.Expr[X])(ev: c.Expr[X <:< XX[T]]): c.Expr[X] = {
import c.universe._
c.Expr(q"$x")
}
}
类型推断可能很难... https://www.scala-lang.org/old/node/9821
https://github.com/scala/bug/issues/2272(破坏者:无法修复)