2011-07-18 86 views
6
調用一個重載的構造

我的代碼如下所示:不能在斯卡拉

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

我得到這個語法錯誤:

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]) 

我不明白爲什麼第二個選擇是不用過的。 「Any」和「_」之間是否有區別讓我絆倒在這裏?

回答

5

正如金已經說了,你需要讓你的陣列協在他的元素類型,因爲Scala的阿拉斯不是協變的像Java的/ C#的。

此代碼將使例如工作:

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

這只是告訴T應協變的編譯器(這類似於Java的? extends T或的out T C#)。

如果您需要了解哪些類型是允許的,哪些不是更多的控制,你也可以使用:

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

這將告訴編譯器T可以是Any任何亞型(可從Any改變到你需要的班級,比如你的例子中的CharSequence)。

兩種情況下工作同樣在這樣的場景:

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] 

編輯:如果有問題的類不在你的控制,聲明你要明確的是這樣的類型:

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

更新

這是有問題的源代碼:

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

我不知道是否有人忘了刪除的解決方法,因爲#2005自2011年5月固定...

+0

我認爲這是假設表是我的課。我需要的表是scala.swing.Table。另外,asInstanceOf似乎沒有幫助。 –

+0

謝謝,明確的打字工作。 (我以爲我早些時候嘗試過,但我想我正在使用舊的目標代碼。) 我看到我有行和列顛倒 - 好吧,這很容易 - 我的標題不顯示。不過對於我在做的事情並不關鍵。 –

3

Array[Array[String]]不是Array[Array[Any]]的子類型,因爲Array的類型參數不是協變的。你應該閱讀co-, contra- and invariance。這應該可以解決它:

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

我不明白那些很這是真的好。但是, val people:Array [Array [Any]] = Array(Array(「John」,「25」),Array(「Mary」,「22」)) 不會顯示錯誤消息。 我想我應該問:「我如何修復我的代碼?」 謝謝! –