Scala:在将它们发送到super之前,我如何使用构造函数params?

kik*_*ito 2 constructor scala

我正在学习Scala.我想实现一个子类,Exception它获取一个名称作为参数,并构建一个嵌入了该名称的消息.与此类似的东西:

class InvalidItem(itemName: String) extends Exception(msg: name) {
  def this(itemName)= {
    super("Invalid item: " + itemName)
  }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只是想在前面加上itemName"Invalid item:"它传递给超了.但我找不到方法.

我试过几个类似的语法(即替换superthis),但继续得到神秘的错误.

在Scala中执行此操作的正确方法是什么?

Tra*_*own 8

您实际上是在extends子句中调用父构造函数,因此以下工作原理:

class InvalidItem(itemName: String) extends Exception("Invalid item name" + itemName)
Run Code Online (Sandbox Code Playgroud)

有关此语法及其动机的讨论,请参阅Daniel Spiewak撰写的此博客文章:

这个extends子句中的一些额外语法是你如何调用超类构造函数......乍一看这看起来有点奇怪,但实际上提供了一种很好的语法方法来确保对超级构造函数的调用始终是构造函数中的第一个语句.在Java中,这当然是经过编译检查的,但是语法中没有任何直观明显的东西阻止您在实现中进一步调用超级构造函数.在Scala中,调用超级构造函数并调用超类方法实现在语法上是完全不同的操作.这导致了更直观的流程,理解为什么可以任意调用一个而另一个必须先调用另一个.