首先,这里有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]]
。
这到底发生了什么?
答案 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]