为什么scala不从Int和Double推断出Any或AnyVal类型?

时间:2016-02-18 02:34:55

标签: scala type-inference

scala有什么作用,然后就是为什么。

我的问题是为什么scala更喜欢将Int转换为Double而不是推断AnyVal或Any:

// test1:
scala> val foo = if (true) 5 else 5.0
foo: Double = 5.0 // Why isn't this AnyVal or Any ?

// I can force it this way... once I realized this was my problem.
scala> val foo: Any = if (true) 5 else 5.0
foo: Any = 5

// or this way, which is better actually
scala> val bar : java.lang.Number = if (true) 5 else 5.0
bar: Number = 5

但我的问题不是它的作用,但为什么将Int转换为Double的行为是正确的还是理性的?

我浪费了相当多的时间将其隔离为造成错误的原因,为了避免这种情况,我希望为这些转换制定一些直觉。

1 个答案:

答案 0 :(得分:3)

它被称为数字扩展。见SLS 6.23.1 - Value Conversions

  

如果e具有与预期类型弱符合的原始数字类型,则使用其中一种数字转换方法将其扩展为预期类型toShort,toChar,toInt,toLong,toFloat,toDouble here here。

弱一致性SLS 3.5.3

中定义
Byte  <:w Short
Short <:w Int
Char  <:w Int
Int   <:w Long
Long  <:w Float
Float <:w Double

Int(传递)弱符合Double,因此编译器会推断Double而不是AnyVal,并使用Int#toDouble进行转换。< / p>

为什么这样可以?您实际上没有提出由此引起的错误。只要遵循弱一致性关系,类型转换就不会丢失任何信息。推断Double而不是AnyVal更有意义,因为您丢失了原本可以保留的类型信息(因为AnyVal不一定是数字)。