2017-05-14 98 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