我有像这样的号码包装
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的隐式匹配?
非常感谢你的帮助。
答案 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]
必须已解决。情况并非如此,编译器提出了上述错误。