2012-07-17 84 views
9

我写了一个接受Seq [String]的所有子类的对象的方法。不幸的是,它不会接受Array [String]类型的对象。 Array [String]不是Seq [String]的子类吗?数组[String]不是Scala中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(" ")) 

回答

10

没有,Array[String]转化为常规的JVM阵列,就像您在Java中看到的:String[]

为什么你看到所有的操作上Array[String],你看到其他的Scala Seq藏品的原因是,有一个implicit conversionArray[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]的方法的主体内的隐式转换的功能。

+2

解释了视图的工作一点点,这个答案将解释所有重要的事情在这里。 – sschaef 2012-07-17 13:09:03

+0

非常有启发性。我对Scala仍然陌生,对我来说,视图范围是新的。我会进入。感谢您的快速回复。 – 2012-07-17 13:19:01

3

的源(或API docs)状态,即Array被定义为

final class Array[T] extends Serializable with Cloneable 

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

相关问题