Scala:如何使用更多构造函数实现 Java class

Scala: how to implement Java class with more constructors

我已经搜索了几个小时,但没有找到解决方案:

我想实现一个扩展 Java class 的 Scala class,它具有不同的构造函数:

Java class (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: javax.swing.ListModel[_],x: String*)com.jgoodies.binding.adapter.AbstractTableAdapter[eu.eyan.idakonyvtar.model.Book] <and>
[INFO]   (x: 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... 导致了问题.. 是否可以扩展这样的抽象class? 谢谢: 安德拉斯

您可以使用 : _* 语法将传入数组解构为可变参数的各种元素,即:

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

编辑:请注意,WrappedArray(vararg 的结果)扩展了 ArrayLike 但我不相信它是 Array.

解决方案确实是用 :_*

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

这个 post 也有帮助: http://daily-scala.blogspot.de/2009/11/varargs.html