无法在伴侣类中找到隐式参数

时间:2015-05-28 22:53:13

标签: scala implicit-conversion implicit-typing

我有像这样的号码包装

class NumWrapper[A<:AnyVal](var v: A)(implicit n:Numeric[A]) {
  def +(other: A): NumWrapper[A] = {
    new NumWrapper(n.plus(v, other))
  }

  def -(other: A): NumWrapper[A] = {
    new NumWrapper(n.minus(v, other))
  }
}

一切正常。但是当我想要隐式转换时,我创建了一个伴随类,如下所示:

object NumWrapper {
  implicit def toNumWrapper[A<:AnyVal](v: A) = new NumWrapper[A](v)
}

但我在编译时遇到错误:

  

找不到参数n的隐含值:数字[A]

这里有什么问题?为什么在编译时试图找到类型A的隐式匹配?

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:1)

Scala中的隐式检查是在编译时执行的(它是一种静态类型语言)。如果编译器无法识别将在调用位置可用的单个,明确的匹配隐式值,则会抱怨。

这里可以解决的一种方法是在toNumWrapper方法中添加隐式需求:

object NumWrapper {
  implicit def toNumWrapper[A<:AnyVal](v: A)(implicit n:Numeric[A]) = new NumWrapper[A](v)
}

这将隐式Numeric的需求推到了需要隐式转换的位置,例如,在控制台中,我可以写:

scala> val chk1 = 3L
chk1: Long = 3

scala> val chk2 = NumWrapper.toNumWrapper(chk1)
chk2: NumWrapper[Long] = NumWrapper@1e89017a

并且编译器很高兴因为(我认为 - 不完全确定这一点)Long值带有它自己的隐含数字[Long]。

答案 1 :(得分:0)

根据您的代码,

class NumWrapper[A<:AnyVal](var v: A)(implicit n:Numeric[A])

要调用new NumWrapper[MyType](v)Numeric[MyType]必须属于隐式解决方案。

所以当你有

object NumWrapper {
  implicit def toNumWrapper[A<:AnyVal](v: A) = new NumWrapper[A](v)
}

正在调用此NumWrapper构造函数,Numeric[A]必须已解决。情况并非如此,编译器提出了上述错误。