【问题标题】:Scala implicit conversions orderScala 隐式转换顺序
【发布时间】:2014-04-25 03:30:07
【问题描述】:

我有两个具有相似方法的对象〜(...)。我还定义了应将对 (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) 
  }
}

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

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

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

【问题讨论】:

    标签: scala


    【解决方案1】:

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

    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"))
    }
    

    【讨论】:

    • 那么有没有办法明确地告诉 scala 使用哪种转换?不幸的是,就我而言,我无法更改正在使用的库中的任何代码
    • @VladislavMiller 我能想到的唯一方法是使用别名隐藏更高优先级的导入(第一个示例)。如果你需要限制隐藏导入的范围,你可以尝试包装它,以及在闭包中使用它的代码。
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2018-09-16
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多