2009-12-11 67 views
19

假設我有這樣的:有沒有辦法控制哪種隱式轉換將成爲默認使用?

class String2(val x:String) { 
    def *(times:Int) : String = { 
     val builder = new StringBuilder() 
     for(i <- 0 until times) { 
      builder.append(x) 
     } 
     builder.toString() 
    } 
} 

現在如果我添加此隱:

implicit def gimmeString2(y:String) = new String2(y) 

我會得到一個編譯錯誤,因爲stringWrapper還增加了這種隱含。有沒有辦法告訴編譯器「忽略其他含義,使用它」,這樣我就不必實例化一個String2對象並在其上工作?

我承認示例代碼可能不是最合適的(對於這個問題),但我認爲它會做。

+0

可能重複:http://stackoverflow.com/questions/1339148/avoiding-implicit-def-ambiguity-in-scala – 2009-12-11 09:54:00

+0

我不認爲這是一個副本。這個問題的作者想保留這兩個含義。我只想要一個。 – Geo 2009-12-11 10:56:28

+0

在RichString中有一個與上面已經提供的方法非常相似的方法。如果你想要使用你的方法,也許你可以使用import a.b. {c => _}技巧來隱藏c,其中c是隱式方法名稱。 – 2009-12-11 11:44:17

回答

29

Scala 2.8爲implicits添加了優先級系統。它在此SIP on the new Java arrays解釋:

當比較的重載方法的或隱式的兩個不同的適用的替代,每個方法獲取一個點具有更具體的參數,另一點爲在一個適當的子類而定義的。一種替代「贏得」對另一如果它得到的點的更大數量的在這兩個比較

斷定如果替代品具有相同的參數類型,這是在一個子類 勝定義的一個。因此,我相信你如下可以聲明implicits:

trait LowPriorityImplicits { 
    //lower priority conversions 
} 

object HighPriorityImplicits extends LowPriorityImplicits { 
    //higher-order ones here 
} 
相關問題