隐式转换 Symbol 时隐藏 any2stringadd

Shadow any2stringadd when implicitly converting Symbol

我正在尝试通过两级隐式(如 here 所述)向 Symbol class 隐式添加函数。 考虑以下代码:

case class A(s: Symbol)
case class B(s: A) {
  def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s))
}
implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s))
implicit def symbolToA(s: Symbol) = A(s)

val x = 'a + 'b

此程序无法编译:

Error: value + is not a member of Symbol

似乎问题在于,scala 没有选择片段中定义的隐式,而是使用 any2stringadd 函数转换 'a。事实上,以下两个实验似乎使代码编译通过:

我都不喜欢这两种解决方案。我的问题是,是否有任何其他方法可以改写我的程序以说服 Scala 改用 select 我的隐含函数?

注意:我使用的是 scala 2.12.1。有趣的是,IntelliJ 并没有抱怨这个片段。

您可以将另一个名为 any2stringadd 的东西引入作用域。

object myDsl {
  object any2stringadd

  case class A(s: Symbol)
  case class B(s: A) {
    def +[X](s: X)(implicit xtoa: X=>A) = B(xtoa(s))
  }
  implicit def xToB[X](s: X)(implicit xtoa: X => A) = B(xtoa(s))
  implicit def symbolToA(s: Symbol) = A(s)
}

import myDsl._
val x = 'a + 'b