如何在 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 尝试这样做时,我使用了这个答案作为指南: 然而,我在试图找出如何正确调用适当的超级构造函数时遇到了一个问题。例如,使用函数似乎是一种很好的方法,如下所示:

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 该怎么做吗?

55084 次浏览

Update: Since M11 (0.11.*), you can use secondary constructors to solve this problem:

class PhotoLibException : RuntimeException {
constructor(message: String, ex: Exception?): super(message, ex) {}
constructor(message: String): super(message) {}
constructor(ex: Exception): super(ex) {}
}

Currently, there's no way to call different super-constructors in different context from the same class. It will be supported in the upcoming months, though.

Use the @JvmOverloads annotation.

class PhotoLibException: RuntimeException {
@JvmOverloads constructor(message: String, ex: Exception?)
}