Не могу вызвать перегруженный конструктор в Scala - PullRequest
6 голосов
/ 18 июля 2011

Мой код выглядит так:

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

Я не понимаю, почему второй вариант не используется. Есть ли различие между «Любой» и «_», что меня здесь сбивает с толку?

Ответы [ 2 ]

5 голосов
/ 18 июля 2011

Как уже сказал Ким, вам нужно сделать свой массив ковариантным в его типе элемента, потому что Арры Скалы не ковариантны, как 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 года ...

3 голосов
/ 18 июля 2011

Array[Array[String]] является , а не подтипом Array[Array[Any]], поскольку параметр типа массива не является ковариантным.Вы должны прочитать о со-, противо- и инвариантности .Это должно исправить это:

val people = 
  Array(Array("John", "25"), Array("Mary", "22")).asInstanceOf[Array[Array[Any]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...