在scala中使用super

时间:2015-03-19 21:59:12

标签: java scala override

我必须将Java代码转换为Scala并使用覆盖类型。我的Java代码是:

public class StatementNode extends Node {
public StatementNode()
{
    super(NodeType.statement);
}

protected StatementNode(NodeType type)
{
    super(type);
}

我的等效scala代码是:

class StatementNode extends Node(NodeType.statement) {
protected def this(`type`: NodeType) {
super(`type`)
}

适用于Java但我发现scala不支持super关键字。那么我们如何在scala中应用overriding类型?请帮忙!如果您需要任何其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

在Scala中,重载的构造函数必须调用类构造函数的最通用形式,该构造函数也必须是默认构造函数。也就是说,你不能拥有StatementNode的无参数构造函数,然后是一个接受NodeType作为参数的重载而不调用无参数的默认构造函数(这是无法工作的,反正)。

相反,你可以这样做:

class StatementNode protected (`type`: NodeType) extends Node(`type`) {
    def this() = this(NodeType.statement)
}

您可以创建默认构造函数protected并使用NodeType参数,然后提供一个不带调用主构造函数的参数的重载并将其传递给NodeType.statement。这应该有效地做同样的事情。

无需在Scala中调用super,因为它是通过extends Node(类型)调用的,这就是默认构造函数必须包含最通用形式的参数的原因。