2012-07-17 13 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]はあなたがJavaで見たもののように、通常のJVMアレイに変換します。String[]

あなたが他のScalaのSeqのコレクションにあなたが見るArray[String]上のすべての操作を参照してください理由はArray[T]からArrayOps[T]implicit conversionがあるということです。

はこれを行います。

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

これはバインドビューと呼ばれています。 TSeq[String]のサブタイプであるか、を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]への暗黙的な変換として動作する機能です。

+2

ビューの作業を少し説明すると、この回答はここで起こっているすべての重要なことを説明します。 – sschaef

+0

非常に啓発です。私はまだScalaには新しく、ビューの境界は私には新しいものです。私はそれに入るでしょう。迅速な返信をありがとう。 –

3

ソース(又はAPI docs)状態は、そのArrayがある

final class Array[T] extends Serializable with Cloneable 

として定義され、それはSeqのサブタイプではありません。ただし、暗黙の変換WrappedArrayがあります。後者はSeqのサブセットです。

関連する問題