2012-07-17 18 views
9

Escribí un método que acepta objetos de todas las subclases de Seq [String]. Desafortunadamente no aceptará un objeto del tipo Array [String]. ¿Array [String] no es una subclase de Seq [String]?¿Array [String] no es una subclase de Seq [String] en 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(" ")) 

Respuesta

10

No, Array[String] se traduce en matrices de JVM regulares, como los que se ven en Java: String[].

La razón por la que ves todas las operaciones en Array[String] que se ve en otros Scala Seq colecciones es que hay un implicit conversion de Array[T] a ArrayOps[T].

hacer esto:

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

Esto se llama una vista obligado. Significa que T debe ser un subtipo de Seq[String] o debe existir una conversión implícita en el alcance que convierta T en Seq[String]. Detrás de las escenas, el compilador realmente añade un parámetro implícito a test, por lo que este método se convierte en:

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

Este implicit evidence$1 es la función que ahora actúa como conversión implícita de T a Seq[String] dentro del cuerpo del método.

+2

explican un poco el trabajo de la vista y esta respuesta explicará todas las cosas importantes que están sucediendo aquí. – sschaef

+0

Muy esclarecedor. Todavía soy nuevo en Scala y los límites de vista son nuevos para mí. Entraré en eso. Gracias por su rápida respuesta. –

3

Las fuentes (o el API docs) estado, que Array se define como

final class Array[T] extends Serializable with Cloneable 

Es decir, no es un subtipo de Seq. Sin embargo, los documentos también mencionan una conversión implícita WrappedArray, donde este último es un subconjunto de Seq.

Cuestiones relacionadas