已移除:弱一致性
在某些情況下,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
),而且與表達式是否為文字無關。然而,事後看來,唯一預期的用例是讓整數文字適應其他表達式的類型。其他類型的數字在其語法中嵌入了明確的類型註解(f
、d
、.
、L
或 '
表示 Char
),這可確保其作者確實希望它們具有該特定類型)。
因此,Scala 3 捨棄了弱一致性的通則,而改為保留一個規則:Int
文字會在必要時調整為其他數字類型。