[英]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
现在是充当函数体内从T
到Seq[String]
的隐式转换的函数。
源(或API docs )状态中,将Array
定义为
final class Array[T] extends Serializable with Cloneable
也就是说,它不是Seq
的子类型。 但是,文档中还提到了隐式转换WrappedArray
,后者是Seq
的子集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.