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
我已经搜索了几个小时,但没有找到解决方案:
我想实现一个扩展 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