正如 Kim 已经说过的,你需要使你的数组在他的元素类型中协变,因为 Scala 的 Arras 不像 Java/C# 那样是协变的。
例如,此代码将使其工作:
class Table[+T](rowData: Array[Array[T]],columnNames: Seq[_])
这只是告诉编译器T
应该是协变的(这类似于 Java 的? extends T
或 C# 的out T
).
如果您需要更多地控制允许哪些类型和不允许哪些类型,您还可以使用:
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] = Table@350204ce
Edit:如果相关类不在您的控制范围内,请显式声明您想要的类型,如下所示:
val people: Array[Array[Any]] = Array(Array("John", "25"), Array("Mary", "22"))
Update
这是有问题的源代码:
// TODO: use IndexedSeq[_ <: IndexedSeq[Any]], see ticket [#2005][1]
def this(rowData: Array[Array[Any]], columnNames: Seq[_]) = {
我想知道是否有人忘记删除解决方法,因为 #2005 自 2011 年 5 月以来已修复......