2013-03-25 158 views
2

書「編程在斯卡拉」規定:斯卡拉:當多個隱式轉換申請

向上穿過斯卡拉2.7,這是故事的結尾。無論何時應用多個隱式轉換,編譯器都拒絕在它們之間選擇 。 Scala 2.8放鬆了這個規則。如果其中一個可用轉換嚴格爲 比其他轉換更具體,那麼編譯器將選擇更具體的 之一。 ...如果滿足以下條件之一,則隱式轉換比另一個更具體:

•前者的參數類型是後者的子類型。

考慮以下情況:

object Encoder { 
    implicit def fromInt(x: => Int) = { println("int"); new Encoder } 
    implicit def fromIntArray(x: => Array[Int]) = { println("int array"); new Encoder } 
    implicit def fromGenericArray[T](x: => Array[T])(implicit subencoder: (=> T) => Encoder) = { 
    println("generic array") 
    subencoder(x(0)) 
    new Encoder 
    } 
} 
val e: Encoder = Array(1) 

的多次轉化可以在這裏申請,但似乎fromIntArray被拾起。如果來自IntArray不存在,則從GenericArray中選擇。我的問題是,在上述規則適用的這種特定情況下,我能否安全地期望來自數組的IntArray將適用於所有其他數組[T]的Array [Int]和來自GenericArray?

+1

我會說是的,但讀Scala語言規範,它會以很大的篇幅來解釋隱含的衝突解決:-) – Felix 2013-03-25 08:24:01

+0

看起來我不得不這樣做。感謝您的建議:) – 2013-03-26 09:47:11

回答

1

從Scala語言規範:

如果有匹配隱含 參數的類型,最特殊的一個會使用 靜態重載決議規則來選擇其中幾個符合條件的參數(§6.26.3 )。如果該參數具有默認參數 ,並且不能找到隱式參數,則使用默認的 參數。

​​