【发布时间】:2013-10-10 20:02:49
【问题描述】:
如果我不包含 Manifest,则会出现隐式转换的编译器错误:
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,那将是理想的。为什么需要它,或者是否有其他方法可以在避免清单的同时完成相同的事情?
【问题讨论】:
标签: scala