这个问题在这里已经有了答案:
9年前关闭。
Scala 能否在一个表达式中应用多个隐式转换?
考虑这个简单的例子:
case class Wrapper(s: String)
case class WrapperWrapper(w: Wrapper)
implicit def string2Wrapper(s: String) = Wrapper(s)
implicit def wrapper2WrapperWrapper(w: Wrapper) = WrapperWrapper(w)
// implicit conversation --> w = string2Wrapper("w")
val w: Wrapper = "w"
// implicit conversation --> ww = wrapper2WrapperWrapper(w)
val ww: WrapperWrapper = w
// does NOT compile!
// ideally --> sad = wrapper2WrapperWrapper(string2Wrapper("ww"))
val sad: WrapperWrapper = "ww"
有没有办法让最后一行中的“双”转换起作用?
我可以通过定义另一个隐式来帮助解决问题:
implicit def string2WrapperWrapper(s:String) = wrapper2WrapperWrapper(s)
不过好像没必要……
最佳答案
恐怕我没有手的简明引用(答案分散在 The Scala Language Specification 的 6.26 和第 7 章中),但答案是 没有 。
这是由于实用性 - 双隐式转换将使可用转换的数量平方,大大增加了冲突的机会,并使计算给定转换会发生什么变得更加困难。
必须自己声明 String
到 WrapperWrapper
转换并不理想;但是考虑到您在实践中很少需要这样做,与双重隐含的潜在混淆相比,我确实认为它是两害相权取其轻。