Array [String]不是Scala中Seq [String]的子类吗?

Bjö*_*obs 9 arrays scala seq scala-collections

我写了一个接受Seq [String]所有子类的对象的方法.不幸的是,它不会接受Array [String]类型的对象.Array [String]不是Seq [String]的子类吗?

scala> def test[T <: Seq[String]](x: T) = {}
test: [T <: Seq[String]](x: T)Unit

scala> val data = "This is a test string"
data: java.lang.String = This is a test string

scala> test(data.split(" "))
<console>:10: error: inferred type arguments [Array[java.lang.String]] do not conform to method test's type parameter bounds [T <: Seq[String]]
              test(data.split(" "))
Run Code Online (Sandbox Code Playgroud)

axe*_*l22 11

不,Array[String]转换为常规JVM数组,就像你在Java中看到的那样:String[].

为什么你看到的所有操作的原因Array[String],你对其他的Scala看到Seq收藏的是,有一个隐式转换Array[T]ArrayOps[T].

做这个:

def test[T <% Seq[String]](x: T) = {}
Run Code Online (Sandbox Code Playgroud)

这称为视图边界.这意味着它T应该是一个子类型,Seq[String]或者应该在范围内存在一个隐式转换,转换T为一个Seq[String].在幕后,编译器实际上添加了一个隐式参数test,因此该方法变为:

scala> def test[T <% Seq[String]](x: T) = {}
test: [T](x: T)(implicit evidence$1: T => Seq[String])Unit
Run Code Online (Sandbox Code Playgroud)

implicit evidence$1是现在用作隐式转换从函数TSeq[String]所述方法的主体内.

  • 解释视图的工作有点限制,这个答案将解释这里发生的所有重要事情. (2认同)

Mal*_*off 5

源(或API 文档)状态,Array定义为

final class Array[T] extends Serializable with Cloneable
Run Code Online (Sandbox Code Playgroud)

也就是说,它不是 的子类型Seq。但是,文档还提到了隐式转换WrappedArray,其中后者是Seq.