0

例如,这段代码编译并输出false,因为 Scala 编译器将 s 隐式转换IntDoubles 而不是 create List[AnyVal],这对我来说看起来很奇怪,因为这会导致数据丢失(例如,浮点类型不精确;对可能具有危险隐式转换的其他类型做类似的事情)。为什么 Scala 的设计者选择这样做?(我使用的是 2.9 版)

object Main {
    def main(args: Array[String]) {
        val x = List(3, 2)
        val y = List(3, 2.0)
        println(x.head / 2 == y.head / 2)
    }
}
4

3 回答 3

2

Lists 是同构类型的。当您将不同类型的项目放入 aList时,编译器必须弄清楚要为整个列表赋予什么类型。当您将 Double 和 Int 放入 aList时,Scala 会决定 的类型List应该是List[Double],因为这两个项目都可以转换为。参见 REPL:

scala> val y = List(3, 2.0)
y: List[Double] = List(3.0, 2.0)

解决方法是手动将您的列表转换为List[Int]

scala> val y = List(3, 2.0).map(_.toInt)
y: List[Int] = List(3, 2)

这样,您的测试就出来了true

scala> println(x.head / 2 == y.head / 2)
true
于 2012-09-26T06:22:36.617 回答
1

您在这里只有两种可能性:提升到Double或扩大到AnyVal。在后一种情况下,甚至没有定义除法,这有点没用。如果你想要求这种行为,你可以显式指定类型:

val y = List[AnyVal](3,2.0)
y.head match {
  case i: Int => println("Whew, it is still an int!")  // This is printed
  case _ => println("Bah, it messed up again")
}
于 2012-09-26T06:22:46.683 回答
0

如果您不想转换为浮点类型,那么为什么要创建具有浮点数的列表?如果您不希望这样,请不要将任何浮点数插入或将这些浮点数转换为非浮点数。

于 2012-09-26T06:27:12.110 回答