私はKotlinの学習を処理しており、理解できない問題に遭遇しました。 KotlinでJavaクラスRuntimeExceptionを拡張し、さまざまな状況で、コンストラクターの3つのうちのいずれか1つを使用できるようにします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 ただし、適切なスーパーコンストラクターを正しく呼び出す方法を理解しようとして問題が発生しました。たとえば、関数を使用することは、次のような優れたアプローチのようです。
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の例では、常に2つの引数を使用してスーパーコンストラクターを呼び出していますが、状況に最も適したコンストラクターを呼び出しているわけではありません。したがって、上記の機能は動作しますが、Javaで各状況で異なるコンストラクターが呼び出されます。上記の各fun内で新しいRuntimeExceptionをインスタンス化しようとしました。それをPhotoLibExceptionにキャストしましたが、それを許可されませんでした。
Kotlinでこれを正しく行う方法を誰でも提案できますか?
Update: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) {}
}
現在、同じクラスから異なるコンテキストで異なるスーパーコンストラクターを呼び出す方法はありません。ただし、今後数か月でサポートされる予定です。