2012-07-17 3 views
9

Seq [String]의 모든 서브 클래스의 객체를 받아들이는 메소드를 작성했습니다. 불행히도 Array [String] 유형의 객체를 허용하지 않습니다. Array [String]이 Seq [String]의 하위 클래스가 아닌가?Array [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 배열로 변환 : String[].

다른 스칼라 Seq 컬렉션에 당신이 볼 Array[String]에 모든 작업을 볼 이유는 Array[T]에서 ArrayOps[T]implicit conversion 있다는 것입니다.

는이 작업을 수행 :

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

이 바인딩 보기라고합니다. TSeq[String]의 하위 유형이거나 TSeq[String]으로 변환하는 범위의 암시 적 변환이 있어야 함을 의미합니다. 내부적 컴파일러 실제로 test에 내재 파라미터를 가산하므로,이 방법이된다 :

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

지금 방법의 체내 Seq[String]-T에서 암시 적 변환 역할을하는 함수이다.

+2

보기의 작업을 조금 설명하면이 답변은 여기에서 진행되는 모든 중요한 작업을 설명합니다. – sschaef

+0

매우 계몽. 저는 여전히 스칼라를 처음 접했고 뷰 경계는 새로운 것입니다. 나는 그것에 들어갈 것이다. 신속한 답장을 보내 주셔서 감사합니다. –

3

소오스 (또는 API docs) 상태, 즉 Array가있다

final class Array[T] extends Serializable with Cloneable 

로 정의되며, 이는 Seq의 아형이 아니다. 그러나 문서에는 암시 적 변환 WrappedArray이 있는데, 후자는 Seq의 하위 집합입니다.