我一直在試驗隱式轉換,並且對使用這些轉換的'enrich-my-libray'模式有一個體面的理解。我想我的基本implicits的理解與運用隱含的證據結合起來......但我誤解的東西重要,如通過下面的方法:我不清楚爲什麼我的範圍內隱式轉換不被接受爲'隱式證據'
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
^
我百思不得其解,因爲我本來以爲我在範圍內隱式的轉換將是足夠的「證據」是詮釋的可轉換爲FooInt的,反之亦然。在此先感謝您爲我設置這個!
UPDATE:
由彼得的出色答卷被unconfused後,下面的燈泡持續了我,你會想使用隱證據的API中的一個很好的理由。我詳細說明了我自己對這個問題的回答(也在下面)。
這不僅回答了問題,而且更清晰的代碼更易於維護。這是一個加號:) –
謝謝,彼得。既然你的答案也提供了一個很好的類型類的簡潔例子,我添加了typeclasses標籤到我原來的問題。 –