在Kotlin中,如何扩展具有多个构造函数的类?

时间:2014-12-30 03:17:13

标签: constructor kotlin

我在学习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中正确地做到这一点吗?

2 个答案:

答案 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?)
}