Scalac对具有类型参数的特征上的implicits的值类的限制

时间:2017-06-26 13:18:32

标签: scala

以下因extends AnyVal而无法编译,因为它会产生以下编译错误:

value class needs to have exactly one val parameter

这里是代码(简化):

sealed trait Thing[A] {
  // stuff
}

object RichThing {
  implicit final class Implicits[A: ClassTag](val thing: A) extends AnyVal {

    def doSomething[B: ClassTag](f: A => B): Thing[A] = {
      // use f internally
    }
  }
}

问题在于我无法触及Thing[A]所在的库,而我正在尝试对其进行扩展,以便对于我们的内部用户而言,其他功能可以像往常一样进行隐式转换。

我可以删除AnyVal但是我的情况是否有解决方法(在2.11中)?

1 个答案:

答案 0 :(得分:3)

值类必须只有一个参数,而您的Implicits类有两个:显式val thing: A和类型为ClassTag[A]的隐式类来自上下文绑定{{1} }。

要满足值类要求,可以将隐式参数[A: ClassTag]从绑定到单个函数签名的上下文中移除:

ClassTag[A]

你使用这个类只是为了提供丰富的方法,所以在什么时候注入implicits并不重要。

当然,你可以删除implicit final class Implicits[A](val thing: A) extends AnyVal { def doSomething[B: ClassTag](f: A => B)(implicit tagA: ClassTag[A]): Thing[A] = { // use f internally } } ,但是实际的extends AnyVal对象将被实例化为每个Implcits调用,这只是不必要的悲观化。