我的代码看起来像这样:
val people = Array(Array("John", "25"), Array("Mary", "22"))
val headers = Seq("Name", "Age")
val myTable = new Table(people, headers)
Run Code Online (Sandbox Code Playgroud)
我收到此语法错误:
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])
Run Code Online (Sandbox Code Playgroud)
我不明白为什么不使用第二种替代方案."Any"和"_"之间是否有区别让我在这里绊倒?
正如Kim已经说过的那样,你需要让你的数组在他的元素类型中协变,因为Scala的Arras不像Java的/ C#那样是协变的.
此代码将使其适用于例如:
class Table[+T](rowData: Array[Array[T]],columnNames: Seq[_])
Run Code Online (Sandbox Code Playgroud)
这只是告诉编译器T应该是协变的(这类似于Java ? extends T或C#out T).
如果您需要更多地控制允许哪些类型以及哪些类型不允许,您还可以使用:
class Table[T <: Any](rowData: Array[Array[T]],columnNames: Seq[_])
Run Code Online (Sandbox Code Playgroud)
这将告诉编译器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] = Table@350204ce
Run Code Online (Sandbox Code Playgroud)
编辑:如果有问题的类不在您的控制范围内,请明确声明您想要的类型:
val people: Array[Array[Any]] = Array(Array("John", "25"), Array("Mary", "22"))
Run Code Online (Sandbox Code Playgroud)
更新
这是有问题的源代码:
// TODO: use IndexedSeq[_ <: IndexedSeq[Any]], see ticket [#2005][1]
def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = {
Run Code Online (Sandbox Code Playgroud)
我想知道是否有人忘记删除解决方法,因为#2005自2011年5月起修复...