我一直在尝试隐式转换,并且我对使用这些的“丰富我的图书馆”模式有一个不错的理解。我试图将我对基本隐含的理解与隐含证据的使用结合起来......但我误解了一些至关重要的东西,如下面的方法所示:
import scala.language.implicitConversions
object Moo extends App {
case class FooInt(i: Int)
implicit def cvtInt(i: Int) : FooInt = FooInt(i)
implicit def cvtFoo(f: FooInt) : Int = f.i
class Pair[T, S](var first: T, var second: S) {
def swap(implicit ev: T =:= S, ev2: S =:= T) {
val temp = first
first = second
second = temp
}
def dump() = {
println("first is " + first)
println("second is " + second)
}
}
val x = new Pair(FooInt(200), 100)
x.dump
x.swap
x.dump
}
当我运行上述方法时,我收到此错误:
Error:(31, 5) Cannot prove that nodescala.Moo.FooInt =:= Int.
x.swap
^
我很困惑,因为我会认为我的范围内隐式转换将是足够的“证据”,即 Int 可以转换为 FooInt,反之亦然。提前感谢您让我明白这一点!
更新:
在对下面彼得的出色回答感到困惑之后,灯泡亮了,这是您希望在 API 中使用隐式证据的一个很好的理由。我在我自己对这个问题的回答中详细说明了这一点(也在下面)。