2

我有一个这样的数字包装器

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 的隐式值:Numeric[A]

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

非常感谢您的帮助。

4

2 回答 2

1

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

您可以在此处解决此问题的一种方法是将隐式要求添加到 toNumWrapper 方法:

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

这会将隐式数字的要求推到需要隐式转换的位置,例如,在控制台中,然后我可以编写:

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

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

编译器很高兴,因为(我认为 - 不完全确定) Long 值带有它自己的隐式 Numeric[Long] 。

于 2015-05-29T01:21:11.787 回答
0

根据你的代码,

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

调用new NumWrapper[MyType](v)aNumeric[MyType]必须在隐式解析的范围内。

所以当你有

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

这是调用这个NumWrapper构造函数,Numeric[A]必须解决。情况并非如此,编译器会引发上述错误。

于 2015-05-28T23:06:45.693 回答