【问题标题】:why doesn't scala infer type Any or AnyVal from Int and Double?为什么scala不从Int和Double推断类型Any或AnyVal?
【发布时间】:2016-02-18 02:34:55
【问题描述】:

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 的行为是正确的还是合理的?

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

【问题讨论】:

    标签: scala type-inference


    【解决方案1】:

    这叫做数字加宽。见SLS 6.23.1 - Value Conversions

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

    弱一致性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进行转换。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2017-09-09
      • 2011-11-06
      相关资源
      最近更新 更多