为什么';t scala从Int和Double推断类型Any或AnyVal?

为什么';t scala从Int和Double推断类型Any或AnyVal?,scala,type-inference,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 fo

这就是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的行为是正确的还是理性的

我浪费了相当多的时间将其隔离为导致错误的原因,为了避免将来出现这种情况,我想为这些转换开发一些直觉。

它被称为数字加宽。见:

如果e具有与预期类型弱一致的原始数字类型,则使用此处定义的数字转换方法ToSort、toChar、toInt、toLong、toFloat和toDouble之一将其扩展为预期类型

弱合规性定义见:

字节
Byte  <:w Short
Short <:w Int
Char  <:w Int
Int   <:w Long
Long  <:w Float
Float <:w Double