对隐式转换组合的比例限制有什么限制

时间:2013-12-17 19:01:15

标签: scala implicit

在以下代码中,最后一行不起作用:

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方法,它就无法工作。

有解决方法吗?

2 个答案:

答案 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存储在值中。