Math 如何‘;1*BigInt(1)和#x2019;工作,我该怎么做?

Math 如何‘;1*BigInt(1)和#x2019;工作,我该怎么做?,math,scala,numeric,implicit,Math,Scala,Numeric,Implicit,我尝试实现一些数字类型,我遇到了 mynum * 1 行,但不行 1 * mynum 我试图定义这样的隐式转换 case class Num(v: Int) { def * (o: Int) = new Num(v*o) } implicit def int2Num(v: Int) = Num(v) 但它似乎不起作用,因为我总是会出现以下错误: scala> 1 * new Num(2) <console>:14: error: overloaded method

我尝试实现一些数字类型,我遇到了

mynum * 1
行,但不行

1 * mynum
我试图定义这样的隐式转换

case class Num(v: Int) {
  def * (o: Int) = new Num(v*o)
}

implicit def int2Num(v: Int) = Num(v)
但它似乎不起作用,因为我总是会出现以下错误:

scala> 1 * new Num(2)
<console>:14: error: overloaded method value * with alternatives:
  (x: Double)Double <and>
  (x: Float)Float <and>
  (x: Long)Long <and>
  (x: Int)Int <and>
  (x: Char)Int <and>
  (x: Short)Int <and>
  (x: Byte)Int
 cannot be applied to (Num)
              1 * new Num(2)
                ^
虽然我在查看代码时无法确定解决方案,但还是有办法的

是什么机制使它工作的


编辑:我用我遇到的实际问题创建了一个新问题。

我认为您的Num类中缺少*方法,该方法接受Num作为参数。

当应用程序
a.meth(args)
失败时,编译器搜索从
a
到具有方法
meth
的隐式视图。任何符合
A=>{def meth(…)}
的隐式值或方法都可以。如果找到一个,代码将重写为
view(a).meth(args)

它看起来在哪里?首先,它查看当前范围,该范围由本地定义的隐式和导入的隐式组成

(实际上还有第二个搜索阶段,其中考虑了带有按名称参数的转换方法,但这对这个答案并不重要。)

如果失败,它将在隐式范围内查找。这包括我们正在搜索的类型的“部分”的伴生对象。在本例中,我们关注的是
A=>{def meth(…)}
,因此我们只看
A
的伴生对象(及其超类型)

在Scala主干中,隐式作用域是,包括参数类型的伴随对象。不确定这是否已经在2.9.1中,也许一位友好的读者会为我找到答案,并更新这个答案


因此,
1+BigInt(2)
被扩展为
BigInt.int2bigInt(1)+BigInt(2)

好地方!我想我的例子太简单了。看起来我的实际问题是另一个问题,虽然有相同的错误信息…回答得很好。有关其含义和范围的更多信息,请参阅。
1 * BigInt(1)