gpt4 book ai didi

scala - 为什么 Scala 将 List[Any] 提升为 List[Long]?

转载 作者:行者123 更新时间:2023-12-04 16:30:13 27 4
gpt4 key购买 nike

在以下代码中:

def test(list: List[Any]): Unit = {
list.foreach {
v =>
v match {
case r: AnyRef => println(r + ": " + r.getClass.getName)
case d: Double => println(d + ": Double")
case f: Float=> println(f + ": Float")
case b: Byte => println(b + ": Byte")
case c: Char => println(c + ": Char")
case s: Short => println(s + ": Short")
case i: Int => println(i + ": Int")
case l: Long=> println(l + ": Long")
case b: Boolean => println(b + ": Boolean")
case _ => throw new IllegalArgumentException("Unknown type: " + v)
}
}
}

test(List(0L, 1.asInstanceOf[Int], 2.asInstanceOf[Short]))

这是输出(Scala 2.8.1):
0: java.lang.Long
1: java.lang.Long
2: java.lang.Long

为什么数字被提升为 java.lang.Long?我该怎么做才能让他们保留他们的 AnyVal类型或“装箱”到等效 AnyRef类型?

最佳答案

我认为答案在Section 3.5.3 of the language reference :

  • 字节弱符合 Short
  • Short 弱符合 Int
  • Char 弱符合 Int
  • Int 弱符合 Long
  • Long 弱符合 Float
  • 浮点数弱符合 Double

  • 因此,Scala 推断出 Short、Int 和 Long 之间的共同类型是 Long,然后将非 Long 对象转换为 Long:
    scala> List(0L, 0, 0: Short) 
    res1: List[Long] = List(0, 0, 0)

    如果您想使用整个弱一致性链,请尝试:
    scala> List(0: Byte, 1: Short, 'c', 3, 4L, 5.0f, 6.0)
    res2: List[Double] = List(0.0, 1.0, 99.0, 3.0, 4.0, 5.0, 6.0)

    而且,当然要说你想要一个 List[Any] ,只需添加 [Any]调用 List :
    scala> List[Any](0: Byte, 1: Short, 'c', 3, 4L, 5.0f, 6.0)
    res11: List[Any] = List(0, 1, c, 3, 4, 5.0, 6.0)

    关于scala - 为什么 Scala 将 List[Any] 提升为 List[Long]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4443277/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com