类型参数 [Nothing,X] 不符合类型参数范围 [T,X<: XX[T]]>
Type arguments [Nothing,X] do not conform to type parameter bounds [T,X<: XX[T]]>
我正在尝试实现一个 returns class 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]]>
是否可以解决此问题?
尝试用隐式类型约束替换类型绑定。以下代码编译
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
我正在尝试实现一个 returns class 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]]>
是否可以解决此问题?
尝试用隐式类型约束替换类型绑定。以下代码编译
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