在 List 的情况下,没有类型声明,Scala 会查看所有元素并尝试找到公共类型。在您的情况下,由于 Int 可以转换为 Double,它将您的混合 List 转换为 List[Double] 提升您的一个 Int。
Map 构造函数采用一系列 2 元组。如果您只是构建了一个元组列表,您将得到相同的行为:
scala> List((1, "one"), (2.0, "two.oh"))
res0: List[(AnyVal, String)] = List((1,one), (2.0,two.oh))
Tuple2[Int, String] 不能自动提升为 Tuple2[Double, String]。在这种情况下,您需要通过类型声明帮助编译器:
scala> val x: List[(Double, String)] = List((1, "one"), (2.0, "two.oh"))
x: List[(Double, String)] = List((1.0,one), (2.0,two.oh))
或者
scala> val x = List[(Double, String)]((1, "one"), (2.0, "two.oh"))
x: List[(Double, String)] = List((1.0,one), (2.0,two.oh))
或者在你的情况下:
scala> val x = List[(Double, String)]((1, "one"), (2.0, "two.oh")).toMap
x: scala.collection.immutable.Map[Double,String] = Map(1.0 -> one, 2.0 -> two.oh)
由于某种原因,在 Map 上使用类型声明不起作用。不知道为什么:
scala> val x = Map[Double, String](1 -> "one", 2.0 -> "two.oh")
<console>:7: error: type mismatch;
found : (Int, String)
required: (Double, String)
val x = Map[Double, String](1 -> "one", 2.0 -> "two.oh")