Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有类型参数的隐式特征的值类的Scalac限制_Scala - Fatal编程技术网

带有类型参数的隐式特征的值类的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
对象,这是不必要的悲观化。

不,值类是围绕单个/标量值的包装器,如果不是,则这是一个普通类(相同的优化不适用)不,值类是单个/标量值的包装,如果不是,则为普通类(相同的优化不适用)