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是现在用作隐式转换从函数T到Seq[String]所述方法的主体内.
源(或API 文档)状态,Array定义为
final class Array[T] extends Serializable with Cloneable
Run Code Online (Sandbox Code Playgroud)
也就是说,它不是 的子类型Seq。但是,文档还提到了隐式转换WrappedArray,其中后者是Seq.