Scala: как реализовать класс Java с большим количеством конструкторов

Я искал часы, но не нашел решения:

Я хочу реализовать класс Scala, который расширяет класс Java с разными конструкторами:

Класс Java (JGoodies):

public abstract class AbstractTableAdapter<E> 
    extends AbstractTableModel implements ListModelBindable

Конструкторы:

AbstractTableAdapter()
AbstractTableAdapter(ListModel listModel)
AbstractTableAdapter(String... columnNames)
AbstractTableAdapter(ListModel listModel, String... columnNames)

ListModel — это общий интерфейс, если это имеет значение:

public interface ListModel<E>

Я пробовал в Scala 2.11:

class LibraryListTableModel(listModel: SelectionInList[Book], columnNames: Array[String]) extends AbstractTableAdapter[Book](listModel, columnNames) {
    def this() = this(null, null)
    def this(listModel: SelectionInList[Book]) = this(null, null)
    def this(columnNames: Array[String]) = this(null, null)
}

но это дает это сообщение об ошибке:

error: overloaded method constructor AbstractTableAdapter with alternatives:
[INFO]   (x$1: javax.swing.ListModel[_],x$2: String*)com.jgoodies.binding.adapter.AbstractTableAdapter[eu.eyan.idakonyvtar.model.Book] <and>
[INFO]   (x$1: String*)com.jgoodies.binding.adapter.AbstractTableAdapter[eu.eyan.idakonyvtar.model.Book]
[INFO]  cannot be applied to (com.jgoodies.binding.list.SelectionInList[eu.eyan.idakonyvtar.model.Book], Array[String])
[INFO]     extends AbstractTableAdapter[Book](listModel, columnNames) {
[INFO]             ^
[ERROR] one error found

Я думаю, что String... вызывает проблему. Можно ли расширить такой абстрактный класс? Спасибо: Андраш


person Andras    schedule 19.09.2015    source источник


Ответы (2)


Вы можете деструктурировать входящий массив на его различные элементы для vararg, используя синтаксис : _*, то есть:

case class Base(strs: String*) {  }
class Sub(ary: Array[String]) extends Base(ary:_*) { }

EDIT: обратите внимание, что WrappedArray (результат vararg) расширяет ArrayLike, но я не верю, что это Array.

person Rich Henry    schedule 19.09.2015

Решение действительно заключалось в том, чтобы пометить параметр String... с помощью :_*

class LibraryListTableModel(listModel: SelectionInList[Book], columnNames: String*) extends AbstractTableAdapter[Book](listModel, columnNames: _*) {...}

Этот пост тоже помог: http://daily-scala.blogspot.de/2009/11/varargs.html

person Andras    schedule 19.09.2015