为什么将 scala Set 转换为 Vector 而不是 List?

Tob*_*iSH 0 types scala scala-collections

我想知道如果我要求一个子类,为什么 aSet[A]被转换Vector[A]为 a Seq[A]?为了说明这一点,请使用以下示例:

val A = Set("one", "two")
val B  = Set("one", "two", "three")

def f(one: Seq[String], other : Seq[String]) = {
  one.intersect(other) match {
    case head :: tail => head
    case _ => "unknown"
  }
}

f(A.to, B.to)
Run Code Online (Sandbox Code Playgroud)

这个函数将返回“unknown”而不是一个。原因是A.to将被强制转换为Vector[String]. cons 运算符 ( ::) 不是为 Vectors 定义的,而是为 Lists 定义的,因此应用了第二种情况并返回“unknown”。为了解决这个问题,我可以使用+:为所有定义的运算符Seqs或将 Set 转换为 List ( A.to[List])。所以我的(学术)问题是:

为什么会A.to返回一个 Vector。至少根据Scala 文档Seqis的默认实现LinearSeq和 this的默认实现是List. 我做错了什么?

Lui*_*rez 5

因为它可以,您依赖于运行时类实现细节,而不是编译时类型信息保证。该totoSeq方法是可以自由返回任何typechecks,甚至有可能产生一个随机数,并在这个数字的基础选择一个具体的类,所以你可能会得到一个列表的东西其他时间向量或什么的。它甚至可以根据操作系统来决定。当然,我在这里很迂腐,希望他们不会那样做,但我的观点是,我们无法真正解释,这就是实现的作用,并且将来可能会发生变化。

此外,Seq 的默认实现是一个列表,仅适用于构造函数。再说一次,他们可能随时改变这种情况。

所以,如果你想要一个List要求一个List,而不是一个Seq