10

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(" "))
4

2 に答える 2

11

いいえ、Array[String]Java で見られるような通常の JVM 配列に変換されますString[]

Array[String]他の ScalaSeqコレクションで見られる操作がすべて表示される理由は、からへの暗黙的な変換があるためです。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]

于 2012-07-17T13:04:42.607 に答える
5

ソース (またはAPI ドキュメント) の状態は、次のArrayように定義されています。

final class Array[T] extends Serializable with Cloneable

つまり、 のサブタイプではありませんSeq。ただし、ドキュメントでは暗黙的な変換についても言及してWrappedArrayおり、後者は のサブセットですSeq

于 2012-07-17T13:09:25.867 に答える