为什么将scala Set强制转换为Vector而不是列表?

问题描述 投票:0回答:1

[我想知道如果我要求Set[A]子类,为什么Vector[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)

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

为什么A.to返回向量。至少根据scala docsSeq的默认实现是LinearSeq,而默认的实现是List。我怎么了

scala types scala-collections
1个回答
5
投票

因为可以,所以您依赖于运行时类实现的详细信息,而不是编译时类型信息的保证。 totoSeq方法可以自由返回进行类型检查的任何内容,它甚至可以生成一个随机数,并以该数字为基础选择一个具体的类,因此您可能会得到List而不是< [向量或其他。它甚至可以根据操作系统来决定。当然,我在这里很脚,希望他们不会那样做,但是我的意思是,我们无法真正解释这是实现的目的,并且将来可能会改变。

此外,

Seq

的默认实现是List”],仅在构造函数中适用。再说一次,他们可能随时改变它。因此,如果要

列表

要求列表,而不是Seq
© www.soinside.com 2019 - 2024. All rights reserved.