带有类型参数的隐式特征的值类的Scalac限制
由于带有类型参数的隐式特征的值类的Scalac限制,scala,Scala,由于扩展了AnyVal,以下内容无法编译,因为它会导致以下编译错误: value class needs to have exactly one val parameter 以下是代码(简化): 问题是,我无法触及thing[A]所在的库,我正在尝试扩展它,以便我们的内部用户能够像隐式转换一样无缝地使用附加函数 我可以删除AnyVal,但是对于我的例子(在2.11中)有没有办法绕过这个限制呢?一个值类必须只有一个参数,而你的隐式类有两个:显式val对象:一个类标签[a]来自上下文绑定的[a:C
扩展了AnyVal
,以下内容无法编译,因为它会导致以下编译错误:
value class needs to have exactly one val parameter
以下是代码(简化):
问题是,我无法触及thing[A]
所在的库,我正在尝试扩展它,以便我们的内部用户能够像隐式转换一样无缝地使用附加函数
我可以删除
AnyVal
,但是对于我的例子(在2.11中)有没有办法绕过这个限制呢?一个值类必须只有一个参数,而你的隐式类有两个:显式val对象:一个类标签[a]
来自上下文绑定的[a:ClassTag]
要满足值类要求,可以将隐式参数ClassTag[A]
从上下文绑定到单个函数签名:
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
}
}
您使用这个类只是为了提供丰富的方法,所以隐式函数在什么时候被注入并不重要
当然,您可以只删除扩展AnyVal
,但随后将为每个doSomething
调用实例化一个实际的implicts
对象,这是不必要的悲观化,而您的Implicits
类有两个:显式val对象:A
和一个类型为ClassTag[A]
的隐式对象来自上下文绑定[A:ClassTag]
要满足值类要求,可以将隐式参数ClassTag[A]
从上下文绑定到单个函数签名:
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
}
}
您使用这个类只是为了提供丰富的方法,所以隐式函数在什么时候被注入并不重要
当然,您可以只删除扩展AnyVal
,但随后将为每个doSomething
调用实例化一个实际的implicts
对象,这是不必要的悲观化。不,值类是围绕单个/标量值的包装器,如果不是,则这是一个普通类(相同的优化不适用)不,值类是单个/标量值的包装,如果不是,则为普通类(相同的优化不适用)