在 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 字面量在必要时会适应其他数值类型。

更多细节