在 GitHub 上編輯此頁面

已移除:弱一致性

在某些情況下,Scala 在測試類型相容性或計算一組類型的最小上界時,會使用弱相容性關係。弱相容性背後的主要動機是讓像這樣的表達式具有類型 List[Double]

List(1.0, math.sqrt(3.0), 0, -3.3) // : List[Double]

很「明顯」這應該是 List[Double]。然而,在沒有任何特殊規定的情況下,清單元素類型的最小上界 (Double, Double, Int, Double) 將會是 AnyVal,因此清單表達式將被賦予類型 List[AnyVal]

一個較不顯而易見的範例如下,它也使用弱相容性關係被輸入為 List[Double]

val n: Int = 3
val c: Char = 'X'
val d: Double = math.sqrt(3.0)
List(n, c, d) // used to be: List[Double], now: List[AnyVal]

在此,不太清楚為什麼類型應該擴充為 List[Double]List[AnyVal] 似乎是一個同樣有效且更具原則性的選擇。

弱相容性適用於所有「數字」類型(包括 Char),而且與表達式是否為文字無關。然而,事後看來,唯一預期的用例是讓整數文字適應其他表達式的類型。其他類型的數字在其語法中嵌入了明確的類型註解(fd.L' 表示 Char),這可確保其作者確實希望它們具有該特定類型)。

因此,Scala 3 捨棄了弱一致性的通則,而改為保留一個規則:Int 文字會在必要時調整為其他數字類型。

更多詳細資料