scala - Seq[AnyVal] 作为类型而不是 Seq[Int] 返回

标签 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)))

结果类型如下:

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)))

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

我是一个 Scala 新手,如果有一个简单的解释,请原谅我。

最佳答案

这就是类型推断的工作原理。 Scala 可以在上下文/声明范围内推断类型,但不能像这里那样跨上下文推断类型。例如,这有效:

scala> val ss = Seq(Seq(1, 1.2))
ss: Seq[Seq[Double]] = List(List(1.0, 1.2))

虽然我们同时拥有 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))

因为第一个列表变成了 Seq[Double] 而第二个列表变成了 Seq[Int]。要查找常见的父类(super class)型,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))

关于scala - Seq[AnyVal] 作为类型而不是 Seq[Int] 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35056905/

相关文章:

scala - Sbt native 打包程序找不到 SystemdPlugin

regex - 我如何在scala中选择具有指定模式的文件名

java - 如果月份是 3 个字母的字符串,如何计算 2 个日期之间的年数

scala - 如何找到数组中最常见的元素?

Scala - 映射序列,当无法处理元素时立即停止

scala - 在Scala2中,如何使用隐式实现匹配类型?

scala - 如何关闭 Apache Spark 2 中生成代码的日志记录?

java - SBT:如何将类的实例打包为 JAR?

scala - Spark 抛出 java.util.NoSuchElementException : key not found: 67

Scala 偏函数类型定义