繁体   English   中英

Scala隐式转换顺序

[英]Scala implicit conversions order

我有两个类似方法的对象〜(...)。 我还定义了隐式转换,它应该将pair(String,A)转换为DemoObject或WopWopWop

class DemoObject[A](t: (String, A)) {
  def ~(t: (String, A)) = "demo"
}

class WopWopWop[A](t: (String, A)) {
  def ~(t: AnyVal) = "wop wop wop"
}

object ImplicitDemoConversions {
  implicit def pair2DemoObject[A](t: (String, A)) = new DemoObject(t)
}

object ImplicitWopWopWopConversions {
  implicit def pair2WopWopWop[A](t: (String, A)) = new WopWopWop(t)
}

但是,有类似的东西

import ImplicitDemoConversions._
object Hello {
  def main(args: Array[String]): Unit = {
    import ImplicitWopWopWopConversions._
    val pair = ("LolTest" -> "A") ~ ("whoa" -> "wop wop wop")

    println(pair) 
  }
}

将打印答案演示而不是预期的wop wop wop 看起来像scala编译器忽略了ImplicitWopWopWopConversions._的第二次导入。

问题是为什么我认为对(String,String)应该转换为WopWopWop ,我如何获得WopWopWop对象而不是DemoObject?

你可以在这里找到真实的例子https://github.com/json4s/json4s/issues/121

您可以使用别名隐藏导入。

import ImplicitDemoConversions.{pair2DemoObject => i}
object Hello {
  def main(args: Array[String]): Unit = {
    import ImplicitWopWopWopConversions.{pair2WopWopWop => i}
    val pair = ("LolTest" -> "A") ~ ("whoa" -> "wop wop wop")

    println(pair) 
  }
}

编辑

你的元组被转换为DemoObject而不是WopWopWop的原因是因为DemoObject~方法参数类型比WopWopWop更具体。

就像这个例子一样:

object A {
    def m(x: AnyVal) { println(x) }
    def m(x: (Int, String)) { println(x) }

    // This will call the first method, because the second method can't be
    // applied to an Int
    a(1)
    // Either method could be applied to a (Int, String), but the second 
    // method will be chosen, because it's argument type is more specific.
    a((1 -> "hello"))
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM