在以下代码中,最后一行不起作用:
case class B(v:String)
case class C(s:B,r:B)
object TestImplicits {
implicit def str2b(s:String) : B = B(s)
implicit def in2b(i:(B,B)) :C = C(i._1,i._2)
val t : B = "hello"
val tb : (B,B) = ("hello","there")
val c : C = tb
val cb : C = (B("hello"),B("there"))
val n : C = ("hello","there")
}
我不明白为什么不 - 它知道如何转换(B,B) - > C和String-> B,它可以转(String,String) - > (B,B)。所有的部分都存在,但如果没有显式(String,String) - > C方法,它就无法工作。
有解决方法吗?
答案 0 :(得分:1)
基于其他linked question,可以这样做:
object TestImplicits {
implicit def str2b(s:String) : B = B(s)
implicit def in2b[B1 <% B](i:(B1,B1)) :C = C(i._1,i._2)
val t : B = "hello"
val tb : (B,B) = ("hello","there")
val c : C = tb
val cb : C = (B("hello"),B("there"))
val n : C = ("hello","there")
}
请注意,in2b的签名现已更改 - 相当于implicit def in2b(i:(B,B))(implicit ev: B1=>B)
答案 1 :(得分:0)
编译器只搜索直接转换,它不知道如何组合2个隐式转换以达到所需类型。解决方法是编写从字符串元组到C的第三个隐式转换,或者将中间B存储在值中。