1

首先,这里有 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]].

这里到底发生了什么?

4

2 回答 2

3

第二个片段的返回类型是List[List[String]],但值是 type Seq[List[String]],这是发生异常。List 是Seq的子类,它是更具体的类型。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 方法的案例类,为了便于阅读,编译器会覆盖该方法。

于 2013-07-11T13:06:05.390 回答
0

第二个片段无法编译,因为Seq.++返回 a scala.collection.Seq(参见ScalaDoc),它不是 a scala.collection.immutable.List

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

另请参阅此问题

于 2013-07-11T13:09:23.657 回答