2017-05-14 75 views
1

我试图通过两个隐含级别(如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的剪断,斯卡拉转换'aany2stringadd功能。事实上,下面的两个实验似乎使代码编译:

  • 我可以使用不同的功能名称,而不是+(如add例如)
  • 我可以明确地在进口阴影any2stringaddimport Predef.{any2stringadd => _ , _}

我不喜欢这两种解决方案。我的问题是,是否有任何其他方式重组我的计划,以说服斯卡拉选择我implicits呢?

NB:我使用Scala的2.12.1。有趣的是,的IntelliJ不抱怨这个片段。

回答

1

您可以将另一个名为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