类型参数[Nothing,X]不符合类型参数范围[T,X <:XX [T]]>

时间:2019-08-12 11:35:04

标签: scala generics type-inference scala-macros

我正在尝试实现一个宏,该宏返回类型为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]]>

是否可以解决此问题?

1 个答案:

答案 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(破坏者:无法修复