已放弃:弱符合 - 更多详情
为了简化底层类型理论,Scala 3 完全放弃了 弱一致性 的概念。相反,它在将类型分配给常量表达式时提供了更大的灵活性。新规则是
-
如果 一系列表达式
Es
作为以下之一出现- 可变参数参数的元素之一,或
- if-then-else 或匹配表达式的备选方案之一,或
- try 表达式的正文和 catch 结果,
-
并且 所有表达式都具有基本数值类型,但它们并不都具有相同的类型,
-
那么 将尝试以下操作
- 表达式
Es
被分成两部分:一方面是Int
常量,另一方面是所有其他表达式。 - 如果所有其他表达式都具有相同的数值类型
T
(可以是Byte
、Short
、Char
、Int
、Long
、Float
、Double
之一),可能需要进行类型提升,并且如果所有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]
本文中