Как уже сказал Ким, вам нужно сделать свой массив ковариантным в его типе элемента, потому что Арры Скалы не ковариантны, как Java / C #.
Этот код заставит его работать, например:
class Table[+T](rowData: Array[Array[T]],columnNames: Seq[_])
Это просто говорит компилятору, что T
должен быть ковариантным (это похоже на ? extends T
в Java или out T
в Java).
Если вам нужно больше контроля над тем, какие типы разрешены, а какие нет, вы также можете использовать:
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
Редактировать: Если рассматриваемый класс не находится под вашим контролем, объявите тип, который вы хотите явно, как это:
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 года ...