繁体   English   中英

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

[英]Is Array[String] not a subclass of Seq[String] in Scala?

我写了一个接受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(" "))

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

之所以看到其他Scala Seq集合上对Array[String]所有操作,是因为存在从Array[T]ArrayOps[T]隐式转换

做这个:

def test[T <% Seq[String]](x: T) = {}

这称为视图绑定 这意味着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

这个implicit evidence$1现在是充当函数体内从TSeq[String]的隐式转换的函数。

源(或API docs )状态中,将Array定义为

final class Array[T] extends Serializable with Cloneable

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM