隐式转换符号时隐藏any2stringadd
问题描述:
我试图通过两个隐含级别(如here所述)向Symbol
类隐式添加函数。 考虑下面的代码:隐式转换符号时隐藏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)
val x = 'a + 'b
这个程序不编译:
Error: value + is not a member of Symbol
看来这个问题是不是采摘中定义的implicits的剪断,斯卡拉转换'a
与any2stringadd
功能。事实上,下面的两个实验似乎使代码编译:
- 我可以使用不同的功能名称,而不是
+
(如add
例如) - 我可以明确地在进口阴影
any2stringadd
:import Predef.{any2stringadd => _ , _}
我不喜欢这两种解决方案。我的问题是,是否有任何其他方式重组我的计划,以说服斯卡拉选择我implicits呢?
NB:我使用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