【问题标题】:Type arguments [Nothing,X] do not conform to type parameter bounds [T,X<: XX[T]]>类型参数 [Nothing,X] 不符合类型参数界限 [T,X<: XX[T]]>
【发布时间】:2019-12-18 23:44:48
【问题描述】:

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

是否可以解决这个问题?

【问题讨论】:

    标签: scala generics type-inference scala-macros


    【解决方案1】:

    尝试用隐式类型约束替换类型绑定。以下代码编译

    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(剧透:不会修复

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2018-12-16
      • 2021-11-01
      • 1970-01-01
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      相关资源
      最近更新 更多