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所解释的,一次两次转换会放大意外转换发生的风险,因此是允许的