[我想知道如果我要求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 docs,Seq
的默认实现是LinearSeq
,而默认的实现是List
。我怎么了
因为可以,所以您依赖于运行时类实现的详细信息,而不是编译时类型信息的保证。 to
或toSeq
方法可以自由返回进行类型检查的任何内容,它甚至可以生成一个随机数,并以该数字为基础选择一个具体的类,因此您可能会得到List而不是< [向量或其他。它甚至可以根据操作系统来决定。当然,我在这里很脚,希望他们不会那样做,但是我的意思是,我们无法真正解释这是实现的目的,并且将来可能会改变。
“ Seq
的默认实现是List”],仅在构造函数中适用。再说一次,他们可能随时改变它。因此,如果要列表
要求列表,而不是Seq。