Kotlin素人すぎてハマったのでメモ。
Kotlinはnullに対して厳密な世界なので関数を記述するときには、きちんと継承元のjava関数のNullableを気にしなくてはならない。
誤った記述
例えば、FragmentのonCreateView.
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle) : View {
}
と書くと、コンパイルは通るのだけれど、実行時にIllegalArgumentExceptionが発生する。
Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
これはsavedInstanceStateにnullが渡ってきて、kotlinのoptional定義と矛盾してしまったため。
正しい記述
java側の定義をみてみる。
@Nullable
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
}
が元の定義なので、
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?) : View? {
}
で継承しなくてはならない。