在 GitHub 上编辑此页面

已放弃:弱符合 - 更多详情

为了简化底层类型理论,Scala 3 完全放弃了 弱一致性 的概念。相反,它在将类型分配给常量表达式时提供了更大的灵活性。新规则是

  • 如果 一系列表达式 Es 作为以下之一出现

    • 可变参数参数的元素之一,或
    • if-then-else 或匹配表达式的备选方案之一,或
    • try 表达式的正文和 catch 结果,
  • 并且 所有表达式都具有基本数值类型,但它们并不都具有相同的类型,

  • 那么 将尝试以下操作

    • 表达式 Es 被分成两部分:一方面是 Int 常量,另一方面是所有其他表达式。
    • 如果所有其他表达式都具有相同的数值类型 T(可以是 ByteShortCharIntLongFloatDouble 之一),可能需要进行类型提升,并且如果所有 Int 字面量在转换为 T 时不会造成精度损失,那么它们将被转换为 T(其他表达式保持不变),
    • 否则,表达式 Es 保持不变。

    精度损失发生在以下情况:

    • Int -> Float 转换常量 c 时,如果 c.toFloat.toInt != c
    • Int -> Byte 转换常量 c 时,如果 c.toByte.toInt != c
    • Int -> Short 转换常量 c 时,如果 c.toShort.toInt != c

示例

inline val b = 33
def f(): Int = b + 1
Array(b, 33, 5.5)      : Array[Double] // b is an inline val
Array(f(), 33, 5.5)    : Array[AnyVal] // f() is not a constant
Array(5, 11L)          : Array[Long]
Array(5, 11L, 5.5)     : Array[AnyVal] // Long and Double found
Array(1.0f, 2)         : Array[Float]
Array(1.0f, 1234567890): Array[AnyVal] // loss of precision
Array(b, 33, 'a')      : Array[Char]
Array(5.toByte, 11)    : Array[Byte]
本文中