有一個情況我得到一個編譯器錯誤的隱式轉換,如果我不包括清單:「曖昧參考超載定義」隱式轉換,而不清單
import scala.language.implicitConversions
abstract class Thing[+A] {
def get:A
}
case class SubThing[+A](a:A) extends Thing[A] {
def get = a
}
object Thing {
implicit def anyToThing[A](a:A):Thing[A] = SubThing(a)
}
object Funcs {
def f(x:Thing[Int]) = x.get + 1
def f(x:Thing[Double]) = x.get + 1.0
}
object Main {
def main(args:Array[String]) = {
println(Funcs.f(1))
}
}
會給
error: ambiguous reference to overloaded definition,
both method f in object Funcs of type (x: Thing[Double])Double
and method f in object Funcs of type (x: Thing[Int])Int
match argument types (Int) and expected result type Any
println(Funcs.f(1))
^
然而,如果我通過在一個隱式清單對於A在隱式轉換:
import scala.language.implicitConversions
abstract class Thing[+A] {
def get:A
}
case class SubThing[+A](a:A) extends Thing[A] {
def get = a
}
object Thing {
implicit def anyToThing[A:Manifest](a:A):Thing[A] = SubThing(a)
}
object Funcs {
def f(x:Thing[Int]) = x.get + 1
def f(x:Thing[Double]) = x.get + 1.0
}
object Main {
def main(args:Array[String]) = {
println(Funcs.f(1))
}
}
導致代碼編譯正常。爲什麼會這樣?在我們的代碼庫中有一個真實的例子,如果您依賴於通用情況下的隱式轉換(通過顯式創建包裝類來消除這種隱式轉換),那麼會出現很多'沒有T的錯誤清單'錯誤;然而,如果我們能夠將Manifest從隱含的轉換中解脫出來,那將是理想的。爲什麼需要它,或者有另一種方法來完成同樣的事情,同時避免清單?