2012-06-13 88 views
2

可能重复:
define your own exceptions with overloaded constructors in scala如何在斯卡拉继承异常

我想写一个斯卡拉例外类的子类的Java异常类,并提供类似的构造器(每个都调用相应的Exception ctor,即我该如何编写这个Java类的Scala等价物:

public class MyException extends java.lang.Exception { 
    public MyException() { 
    } 

    public MyException (String msg) { 
     super(msg); 
    } 

    public MyException (Throwable e) { 
     super(e); 
    } 

    public MyException (String msg, Throwable cause) { 
     super(msg, cause); 
    } 
} 

这似乎与this question有关,但是其中的答案并不令人满意(因为子类实际上没有定义)。

+0

该问题的接受答案不回答我的问题,因为它没有调用不同的构造函数。它通过使用Exception的实现细节的知识来欺骗,并为每个子类的构造函数调用相同的基类构造函数。 –

+2

在Scala中不可能有多个ctors。所以相关问题的接受答案确实回答了你的问题。 – sschaef

+0

这是@Antoras说:http://scala-programming-language.1934581.n4.nabble.com/how-to-call-super-class-s-contructor-td1934801.html – tenshi

回答

1

这种重载的构造函数每个调用超类的构造函数都是唯一的例子,我知道Scala不能生成等价的字节码给Java。在Scala中,必须调用主构造函数。次要构造函数可以被定义,但它们只能调用主要构造函数。

我认为Scala的方式要好得多,但它确实意味着您的异常类的确切等价物无法定义。这在实践中从未造成过问题,因为您可以将null或其他默认值传递给最一般的超类构造函数。

+3

Scala也不能产生对应于Java枚举的字节码。 –

+0

是的,我忘记了这一点。 – Lachlan

6

如何使用默认值(空)?

class YourException (msg:String=null, cause:Throwable=null) 
    extends java.lang.Exception (msg, cause) {}