Scala:在将构造函数参数发送到super之前,我如何处理它们?

Scala:在将构造函数参数发送到super之前,我如何处理它们?,scala,constructor,Scala,Constructor,我在学Scala。我想实现Exception的子类,该子类获取一个名称作为参数,并构建一条嵌入该名称的消息。类似于此: class InvalidItem(itemName: String) extends Exception(msg: name) { def this(itemName)= { super("Invalid item: " + itemName) } } 在本例中,我只想在传递给超级构造函数之前,在itemName前面加上“Invalid item:”。但是我

我在学Scala。我想实现
Exception
的子类,该子类获取一个名称作为参数,并构建一条嵌入该名称的消息。类似于此:

class InvalidItem(itemName: String) extends Exception(msg: name) {
  def this(itemName)= {
    super("Invalid item: " + itemName)
  }
}
在本例中,我只想在传递给超级构造函数之前,在
itemName
前面加上
“Invalid item:”
。但是我找不到路

我尝试过几种类似的语法(即用
this
替换
super
),但总是会出现一些隐晦的错误


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

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

class InvalidItem(itemName: String) extends Exception("Invalid item name" + itemName)
有关此语法及其动机的讨论,请参见Daniel Spiewak的示例:

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


谢谢你的回答。对于我的具体病例,特拉维斯的回答更简单,但我会记住你的建议,以便在我需要更复杂的治疗时使用。我知道这有点离题,但我仍然会利用这个机会引导你朝着这两个方向走。在scala中,它用于许多java中会出现异常的地方。在我看来,这是一个非常有用的概念。你可以看看这里:谢谢。我认为这两种情况对我来说都有点太高了。我昨天从Scala开始。我会记下笔记,让它在将来的时候看一看,当我对基本的东西比较熟悉的时候。
class InvalidItem private(val name: String) extends Exception(name)

object InvalidItem{
  def apply(name: String) = new InvalidItem("Invalid item: " + name)
}

object Text extends App{
    val item = InvalidItem("asd")
    println(item.name)
    //Invalid item: asd
}