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

时间:2015-09-19 16:09:38

标签: scala scala-2.11

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

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

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...会导致问题。 是否可以扩展这样一个抽象类? 谢谢: 安德拉什

2 个答案:

答案 0 :(得分:3)

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

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

编辑:注意,WrappedArray(vararg的结果)延伸ArrayLike,但我不相信它是Array

答案 1 :(得分:0)

解决方案确实用以下方式标记String ...参数:_ *

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

这篇文章也有帮助: http://daily-scala.blogspot.de/2009/11/varargs.html