以下因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中)?
答案 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
调用,这只是不必要的悲观化。