Error checkParameterIsNotNull en muestra de actividad de inicio de session

Estoy intentando iniciar kotlin con una muestra estándar en Android Studio. Antes que nada, creo un nuevo proyecto con la plantilla de actividad de inicio de session, luego lo convierto para usar kotlin. Pero tengo error de time de ejecución (no comstackr) en esta cadena:

loaderManager.initLoader(0, null, this) 

Listado de errores:

 Caused by: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter bundle 

Como LoaderManager.initLoader(int, Bundle, LoaderManager.LoaderCallbacks) es código Java, Kotlin visualiza sus parameters como Int, Bundle!, LoaderManager.LoaderCallbacks<D!>!) . Esos signos de admiración son la notación de Kotlin para los types de plataforma . Bundle! significa "¿ Bundle o Bundle? ". es decir, es la forma de Kotlin de afirmar que no sabe si un parámetro es no nulo o nulo.

Android tiene annotations de @NonNull Java (es decir, @NonNull y @Nullable ) que se pueden usar para especificar esto para que los comstackdores, etc., aprovechen pero no se hayan utilizado aquí. Si lo fueran, ¿Kotlin inferiría que ese tipo es Bundle o Bundle? dependiendo de qué anotación está presente.

La documentation de Android para args: Bundle! indica que es opcional, es decir, args: Bundle? (pero el comstackdor de Kotlin no puede inferir esto porque carece de una anotación @NonNull ). Si inspecciona el rastro de la stack completa de la exception arrojada, sospecho que encontrará una function de Kotlin que recibe args: Bundle pero debería recibir args: Bundle? .

es decir, si tiene algo así como

 override fun onCreateLoader(id: Int, args: Bundle): Loader<Cursor> = TODO() 

entonces debería ser en cambio

 override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> = TODO() 

porque el comstackdor de Kotlin inserta un control no nulo para el primero pero no el último.

Consulte Null-Safety and Platform Types – Llamando a Java desde Kotlin – Kotlin Programming Language para más detalles.

La respuesta es bastante simple, solo reemplace null para vaciar Bundle() :

 loaderManager.initLoader(0, Bundle(), this) 

Pero no puedo entender por qué Kotlin no detecta esto sobre la marcha.

La respuesta exacta es modificar la function onCreateLoader

override fun onCreateLoader(i: Int, bundle: Bundle?): Loader<Cursor>

 loaderManager.initLoader(0,myBundle ?: Bundle(),this) 

Si myBundle es nulo, loadermanager usará Bundle ()