Scala可以在一个表达式中应用多个隐式转换吗?

Scala可以在一个表达式中应用多个隐式转换吗?,scala,Scala,可能重复: 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) // im

可能重复:

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)

但这似乎没有必要……

我恐怕手头没有一个简明的参考资料(答案分散在6.26和的第7章中),但答案是否定的

这是由于实用性-双隐式转换将使可用的可能转换数量平方,从而大大增加碰撞的机会,并使计算给定转换的确切结果变得更加困难


您必须自己声明
字符串
包装器
转换,这并不理想;但是,在实践中,你很少需要这样做,相比于双引申的潜在混淆,我认为它是两个邪恶的较小。

你可以相当简洁地强制转换序列:

scala>   val sad: WrapperWrapper = ("ww": Wrapper)           
sad: WrapperWrapper = WrapperWrapper(Wrapper(ww))
正如@Andrzej Doyle所解释的,一次两次转换会放大意外转换发生的风险,因此是允许的