在此示例中了解Scala中的类型转换/错误

时间:2013-07-11 13:00:01

标签: scala

首先,这里有3个代码片段及其在Scala 2.10.2上的输出

// 1.
def one: Seq[List[String]] =
  Seq(List("x")) ++ List(List("x"))
println(one)
// => List(List(x), List(x)))

// 2.
def two: List[List[String]] =
  Seq(List("x")) ++ List(List("x"))
println(two)
// =>
// error: type mismatch;
//  found   : Seq[List[String]]
//  required: List[List[String]]
//   Seq(List("x")) ++ List(List("x"))
// one error found

// 3.
println(Seq(List("x")) ++ List(List("x")))
// => List(List(x), List(x))

所有3个片段中的主要代码都是相同的 - Seq(List("x")) ++ List(List("x"))

第一个和第三个代码段显示(打印)类型为List[List[String]],但第二个代码段(指定返回类型为List[List[String]]无法编译。第一个的返回类型是Seq[List[String]],但它打印为List[List[String]]

这到底发生了什么?

2 个答案:

答案 0 :(得分:3)

第二个代码段的返回类型为List[List[String]],但该值的类型为Seq[List[String]],这是异常发生。 List是Seq的subclass,它是更具体的类型。 println打印出你拥有的值,但不打印它们的类型,如果你想看到表达式的实际类型,请在Scala REPL中打印出来:

scala> Seq(List("x")) ++ List(List("x"))
res5: Seq[List[String]] = List(List(x), List(x))

请参阅res5类型被视为Seq[List[String]],但值为List(List(x), List(x))。 List是一个自动覆盖toString方法的case类,为了便于阅读,它被编译器覆盖。

答案 1 :(得分:0)

第二个代码段无法编译,因为Seq.++返回scala.collection.Seq(请参阅ScalaDoc),这不是scala.collection.immutable.List

def ++[B](that: GenTraversableOnce[B]): Seq[B]

另见this question