我正在学习 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/
相关文章:
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 有什么区别?