我在学习Kotlin的过程中遇到了一个我无法弄清楚的问题。 我想在Kotlin中扩展Java类RuntimeException,并且能够在不同的情况下使用它的三个构造函数中的任何一个(基于我想要抛出异常时的信息)。在java中,我的类看起来像这样:
public class PhotoLibException extends RuntimeException {
public PhotoLibException(String message, RuntimeException ex) {
super(message, ex);
}
public PhotoLibException(String message) {
super(message);
}
public PhotoLibException(RuntimeException ex) {
super(ex);
}
}
当我尝试在Kotlin中执行此操作时,我使用此答案作为指导:Kotlin secondary constructor但是,我在尝试弄清楚如何正确调用适当的超级构造函数时遇到了问题。例如,使用函数似乎是一种很好的方法,如下所示:
fun PhotoLibException(message: String): PhotoLibException {
val ex = null
return PhotoLibException(message, ex)
}
fun PhotoLibException(ex: Exception): PhotoLibException {
val message = ""
return PhotoLibException(message, ex)
}
class PhotoLibException(message: String, ex: Exception?): RuntimeException(message, ex) {
}
但是,在上面的Kotlin示例中,我总是使用两个args调用超级构造函数,而不是调用最适合该情况的构造函数。所以我上面的工作,但不完全是在Java中做的事情,在每种情况下调用不同的构造函数。 我还尝试在上面的每个乐趣中实例化一个新的RuntimeException,并将其转换为PhotoLibException,但我不允许这样做。
有人可以建议我如何在Kotlin中正确地做到这一点吗?
答案 0 :(得分:91)
更新:自M11(0.11。*)起,您可以使用secondary constructors来解决此问题:
class PhotoLibException : RuntimeException {
constructor(message: String, ex: Exception?): super(message, ex) {}
constructor(message: String): super(message) {}
constructor(ex: Exception): super(ex) {}
}
目前,没有办法在同一个类的不同上下文中调用不同的超级构造函数。不过,它将在未来几个月内得到支持。
答案 1 :(得分:2)
使用@JvmOverloads注释。
class PhotoLibException: RuntimeException {
@JvmOverloads constructor(message: String, ex: Exception?)
}