我想用一個科特林數據類作爲一個例外,它似乎很動聽:科特林構造屬性和調用不同的超構造
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