我想用一个科特林数据类作为一个例外,它似乎很动听:科特林构造属性和调用不同的超构造
data class MyException(val extraData: Any) : RuntimeException()
我还希望能够在cause
传递到在那些存在的情况下超级班。不幸的是,数据类只能在它们的主构造函数中有val
/var
,并且由于默认的构造函数调用无参数构造函数,所以似乎我根本无法做到这一点,因为没有总是要求cause
被传递,和存储为在我的班级,我不想要的领域。
我想是这样的:
data class MyException(val extraData: Any) : RuntimeException() {
constructor(extraData: Any, cause: Throwable) : this(extraData) super(cause) {}
}
看来,即使我不使用数据类,我现在还不能使用便捷的var
/val
构造辅助函数,因为它们可以只能在必须选择使用哪个超级构造函数的主构造函数上。我能想出最好的是这个,这是相当详细的:
class MyException : RuntimeException {
val extraData: Any
constructor(extraData: Any) {
this.extraData = extraData
}
constructor(extraData: Any, cause: Throwable) : super(cause) {
this.extraData = extraData
}
}
我错过了什么吗?是否真的没有办法根据重载的构造函数有条件地调用不同的超类构造函数,并且仍然能够使用参数语法var
/val
?如果是这样,为什么?有没有更好的方法做这种事情?
谢谢。这个和@ holi-java的答案对于'Exception'情况来说都很好,因为Exception允许一个空的原因并正确处理它。无法调用不同的超级构造函数并使用'var' /'val'参数的更普遍的问题仍然没有答案。 –
@YonaAppletree简而言之,这是不可能的。但是如果你正在寻找解释,我已经将它添加到答案中。 – Malcolm