类型参数 [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

https://github.com/scala/bug/issues/2272(剧透:不会修复