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但是,我在试图弄清楚如何正确调用适当的 super 构造函数时遇到了问题。例如,使用函数似乎是一种不错的方法,如下所示:

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 调用 super 构造函数,而不是调用最适合这种情况的构造函数。因此,我在上面所做的工作,但并没有完全像在 Java 中所做的那样,在每种情况下都会调用不同的构造函数。 我还尝试在上面的每个 fun 中实例化一个新的 RuntimeException 并将其转换为 PhotoLibException,但我不被允许这样做。

谁能建议我如何在 Kotlin 中正确执行此操作?

最佳答案

更新:从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) {}
}

目前,没有办法在同一个类的不同上下文中调用不同的 super 构造函数。不过,它将在接下来的几个月内得到支持。

https://stackoverflow.com/questions/27699184/

相关文章:

java - 在 Kotlin 中同时扩展和实现

dictionary - Kotlin 是否有 Map 文字的语法?

java - 在 Kotlin 中定义 log TAG 常量的最佳方法是什么?

java - 如何将 Java 源文件的一部分转换为 Kotlin?

kotlin - 在 Android Studio 中构建时如何解决错误 "Failed to re

java - 将 Kotlin 数据对象映射到数据对象的更好方法

generics - kotlin 中的 out 关键字是什么

kotlin - Kotlin 中的 crossinline 和 noinline 有什么区别?

android - Kotlin - 将 List 转换为 MutableList 的最惯用方式

kotlin - 如何在 Kotlin 中迭代 hashmap?