如何控制应用于方法参数的隐式转换的优先级?

时间:2013-11-21 17:58:08

标签: scala implicit-conversion overloading

假设代码:

class A
class B

class Something {
  def method(arg: A) = ???
  def method(arg: B) = ???
}

class C

object C {
  implicit def ctoa(c: C): A = ???
  implicit def ctob(c: C): B = ???
}

此外:

  • 无法修改类ABSomething及其随播广告
  • 必须有从CA以及CB的隐式转换,其优先级无关紧要
  • 除此之外,班级C及其伴侣可以自由修改
  • 当然,可以添加更多类型,含义等

现在,有没有办法进行编译:

(new Something).method(new C)

1 个答案:

答案 0 :(得分:2)

我知道这不是你想要的,但我没有看到任何办法,除了将其中一个隐含在另一个范围内。

class A
class B

class Something {
  def method(arg: A) = println("method(A)")
  def method(arg: B) = println("method(B)")
}

class C

object C {
  implicit def ctoa(c: C): A = new A
}

object X {
  implicit def ctob(c: C): B = new B
}

然后你得到:

scala> (new Something).method(new C)
method(A)

否则,您试图违反非歧义规则:“只有在没有其他可能的插入转换时才会插入隐式转换。”见Programming in Scala