2011-07-18 19 views
6

Mi código es el siguiente:No se puede llamar a un constructor sobrecargado en Scala

val people = Array(Array("John", "25"), Array("Mary", "22")) 
val headers = Seq("Name", "Age") 
val myTable = new Table(people, headers) 

me sale este error de sintaxis:

overloaded method constructor Table with alternatives: 
    (rows: Int,columns: Int)scala.swing.Table 
    <and> 
    (rowData: Array[Array[Any]],columnNames: Seq[_])scala.swing.Table 
    cannot be applied to 
    (Array [Array[java.lang.String]], Seq[java.lang.String]) 

no veo la razón por la segunda alternativa no es usado. ¿Hay alguna distinción entre "Cualquiera" y "_" que me está molestando aquí?

Respuesta

5

Como ya se dijo Kim, que necesita para hacer la matriz de covarianza en su tipo de elemento, porque Arras de Scala no son covariantes como el de Java/C# 's.

Este código será hacer que funcione por ejemplo:

class Table[+T](rowData: Array[Array[T]],columnNames: Seq[_]) 

Este dice al compilador que debe T covariante (esto es similar a la de ? extends T Java o C# 's out T).

Si necesita más control sobre lo que se permite tipos y cuáles no, también se puede utilizar:

class Table[T <: Any](rowData: Array[Array[T]],columnNames: Seq[_]) 

Esto le dirá al compilador que T puede ser cualquier subtipo de Any (que se puede cambiar de Any a la clase que necesita, como CharSequence en su ejemplo).

Ambos casos funcionan de la misma en este escenario:

scala> val people = Array(Array("John", "25"), Array("Mary", "22")) 
people: Array[Array[java.lang.String]] = Array(Array(John, 25), Array(Mary, 22)) 

scala> val headers = Seq("Name", "Age") 
headers: Seq[java.lang.String] = List(Name, Age) 

scala> val myTable = new Table(people, headers) 
myTable: Table[java.lang.String] = [email protected] 

Editar: Si la clase en cuestión no está bajo su control, declarar el tipo que desee de forma explícita como esto:

val people: Array[Array[Any]] = Array(Array("John", "25"), Array("Mary", "22")) 

Actualización

Este es el código fuente en cuestión:

// TODO: use IndexedSeq[_ <: IndexedSeq[Any]], see ticket [#2005][1] 
def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = { 

Me pregunto si alguien se olvidó de retirar la solución, porque # 2005 se fija desde mayo de 2011 ...

+0

Creo que esto supone que Table es mi clase. La tabla que necesito es scala.swing.Table. Además, asInstanceOf no parece ayudar. –

+0

Gracias, la mecanografía explícita hace el trabajo. (Pensé que lo había intentado antes, pero creo que estaba usando un código de objeto antiguo.) Veo que tengo las filas y las columnas invertidas, está bien, eso es fácil, y mis encabezados no se muestran.Sin embargo, no es crítico para lo que estoy haciendo. –

3

es no un subtipo de Array[Array[Any]] porque el parámetro de tipo de matriz no es covariante. Debe leer en co-, contra- and invariance. Esto debería solucionarlo:

val people = 
    Array(Array("John", "25"), Array("Mary", "22")).asInstanceOf[Array[Array[Any]] 
+0

Es verdad que no entiendo los muy bien. Sin embargo, val people: Array [Array [Any]] = Array (Array ("John", "25"), Array ("Mary", "22")) no muestra un mensaje de error. Supongo que debería haber preguntado: "¿Cómo puedo arreglar mi código?" Gracias! –

Cuestiones relacionadas