2012-07-17 12 views
9

Ho scritto un metodo che accetta oggetti di tutte le sottoclassi di Seq [String]. Sfortunatamente non accetterà un oggetto del tipo Array [String]. Is Array [String] non è una sottoclasse di Seq [String]?Is Array [String] non è una sottoclasse di Seq [String] in Scala?

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

risposta

10

No, Array[String] traduce in array JVM regolari, come quelle che si vedono in Java: String[].

Il motivo per cui si vedono tutte le operazioni sul Array[String] che si vede su altri Scala Seq collezioni è che c'è un implicit conversion da Array[T] a ArrayOps[T].

fare questo:

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

Questo si chiama una vista legata. Significa che T dovrebbe essere un sottotipo di Seq[String] o che dovrebbe esistere una conversione implicita nell'ambito che converte T in un Seq[String]. Dietro le quinte, il compilatore effettivamente aggiunge un parametro implicito per test, quindi questo metodo diventa:

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

Questa implicit evidence$1 è la funzione che ora funge conversione implicita da T al Seq[String] all'interno del corpo del metodo.

+2

spiegare il lavoro della vista limitata un po 'e questa risposta spiegherà tutte le cose importanti che succedono qui. – sschaef

+0

Molto illuminante. Sono ancora nuovo di Scala e i limiti di visualizzazione sono nuovi per me. Ci entrerò in quello. Grazie per la tua rapida risposta. –

3

Le fonti (o API docs) stato, che è definito come Array

final class Array[T] extends Serializable with Cloneable 

Cioè, non è un sottotipo di Seq. Tuttavia, i documenti menzionano anche una conversione implicita WrappedArray, dove quest'ultimo è un sottoinsieme di Seq.

Problemi correlati