2011-06-10 183 views
2

我寫這個方法斯卡拉 - 仿製藥+隱式轉換

def compare[U, T <: Comparable[U]](a: T, b: U) = a.compareTo(b) 

它與字符串和整數,但不能使用INT或RichInt。 那麼爲什麼不是一個Int自動轉換爲Integer?

回答

4

使用簡單的上下文綁定將需要編譯器應用隱式轉換之前轉換後的值傳遞給方法。我相信你要的是這個,而是:

def compare[U, T <% Comparable[U]](a: T, b: U) = a.compareTo(b) 

這裏,隱式包裝「A」會發生的方法的實現裏面,所以你應該能夠得到你想要的東西。但是,我並不完全清楚你的用途是什麼,但你應該嘗試包括什麼不起作用的例子,以便我們能夠確定何時我們試着回答!

+2

這絕對是正確的使用模式。如果可以,我建議使用Scala的Ordered而不是Comparable。有序是Comparable的一個子特性,因此它們是兼容的。我確實想知道這種性能影響。對於每一個整數比較,我們知道有一個函數調用(可能是一個Integer的框),這對於重排比較操作來說不是很好。 – 2011-06-10 16:25:05

+0

謝謝。所以<:和<%之間的唯一區別是如何處理隱式轉換? – SpiderPig 2011-06-10 16:36:21

+1

<:只是一個綁定類型,而<%是一個視圖綁定。看到這個問題的全部細節:http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala – mpilquist 2011-06-10 16:55:48