Как LoaderManager.initLoader(int, Bundle, LoaderManager.LoaderCallbacks)
является кодом Java, Kotlin рассматривает его параметры как Int, Bundle!, LoaderManager.LoaderCallbacks<D!>!)
. Эти восклицательные знаки - это notation for platform types. Bundle!
означает "Bundle
или Bundle?
". т. е. это способ Котлина заявить, что он не знает, является ли параметр ненулевым или нулевым.
Android имеет Java nullability annotations (а именно @NonNull
и @Nullable
), которые могут быть использованы для определения этого для компиляторов и т.д., чтобы использовать, но они не были использованы здесь. Если бы они были, Котлин вывел бы этот тип либо Bundle
, либо Bundle?
в зависимости от того, какая аннотация присутствует.
документация Android для args: Bundle!
заявляет, что он не является обязательным, т.е. args: Bundle?
(но компилятор Котлин не может сделать вывод, это потому, что в нем отсутствует @NonNull
аннотацию). Если вы проверяете полную трассировку стека заброшенного исключения, я подозреваю, что вы найдете функцию Kotlin, которая получает args: Bundle
, но должна получать args: Bundle?
.
т.е. если у вас есть что-то вроде
override fun onCreateLoader(id: Int, args: Bundle): Loader<Cursor> = TODO()
, то он должен быть вместо этого
override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> = TODO()
, потому что компилятор Котлин вставляет не-нулевой чек на первое, но не последнее.
Для получения более подробной информации см. Null-Safety and Platform Types - Calling Java from Kotlin - Kotlin Programming Language.
Вы не показывают трассировки стека, возможно, это еще один метод, который продвигает цепочку, когда что-то обращается к Котлину, который затем проверяет нулевое значение параметра. –