Seq [AnyVal]以类型而不是Seq [Int]的形式返回

fem*_*yte 3 scala

我定义了以下元组列表:

var temps = Seq(("Spain", Seq(68,70,73,75)),       
                ("Trinidad",Seq(87,83,88,84,88)), 
                ("England",Seq(52,55,58,57.5)),
                ("Eritrea",Seq(90,91.3,88,91)))
Run Code Online (Sandbox Code Playgroud)

结果类型如下:

temps: Seq[(String, Seq[AnyVal])] = List((Spain,List(68, 70, 73, 75)), (Trinidad,List(87, 83, 88, 84, 88)), (England,List(52.0, 55.0, 58.0, 57.5)), (Eritrea,List(90.0, 91.3, 88.0, 91.0)))
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么temps的类型被推断为Seq[(String, Seq[AnyVal])]而不是Seq[(String, Seq[Int])] or Seq[(String, Seq[Double])]人们所期望的?

如果有一个简单的解释,我是斯卡拉新手,请原谅我.

yǝs*_*ǝla 5

这就是类型推断的工作原理.Scala可以在上下文/声明范围中推断类型,但不能在此处的上下文中推断类型.例如,这有效:

scala> val ss = Seq(Seq(1, 1.2))
ss: Seq[Seq[Double]] = List(List(1.0, 1.2))
Run Code Online (Sandbox Code Playgroud)

虽然我们有两个IntDouble,Int被提拔起来的.但是,这不起作用:

scala> val ss = Seq(Seq(1, 1.2), Seq(2, 2))
ss: Seq[Seq[AnyVal]] = List(List(1.0, 1.2), List(2, 2))
Run Code Online (Sandbox Code Playgroud)

因为第一个列表变得Seq[Double]和第二个- Seq[Int].找到常见的超类型scala恢复为Seq[AnyVal].

您可以显式注释声明以帮助编译器解决歧义:

scala> val ss: Seq[Seq[Double]] = Seq(Seq(1, 1.2), Seq(2, 2))
ss: Seq[Seq[Double]] = List(List(1.0, 1.2), List(2.0, 2.0))
Run Code Online (Sandbox Code Playgroud)