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的行为是正确的还是理性的?
我浪费了相当多的时间将其隔离为造成错误的原因,为了避免这种情况,我希望为这些转换制定一些直觉。
答案 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
不一定是数字)。