Источником этой проблемы является Совместимость между Java и Kotlin . Между Java
и Kotlin
существуют некоторые базовые языковые различия, что вызывает проблемы взаимодействия. Android Studio предоставляет некоторые Lint
проверки для их предупреждения, такие как Unknown Nullness
. ( ссылка )
![enter image description here](https://i.stack.imgur.com/MdWn0.png)
Взглянув на подробности Unknown nullness
Проверка Lint с android.com , мы увидим, что:
Чтобы улучшить ссылочный код с Kotlin
, рассмотрите возможность добавления здесь явной информации об аннулировании с помощью @NonNull
или @Nullable
.
и developer.android.com :
Если вы используете Kotlin
для ссылки на аннотированный элемент имени, определенный в классе Java
( например a String
), компилятор не знает, отображается ли String
на String
или String?
в Kotlin
. Эта неоднозначность представлена через тип платформы , String!
.
и на kotlinlang.org :
Любая ссылка в Java
может быть null , что делает требования Kotlin
строгой нулевой безопасностинецелесообразно для объектов, поступающих с Java
. Типы Java
объявлений обрабатываются специально в Kotlin
и называются типами платформ .
Поэтому, когда мы переопределяем метод Java
, чтобы его аргументы не были аннотированы аннотациями недействительности, IDE добавляет обнуляемый знак (?
) для аргументов в классе Kotlin
. Это приводит к избеганию выброса NullPointerException
при вызове метода в Java
путем передачи значения null
для одного из аргументов.
webview.webViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView, // <- potential to throw NPE before executing the function block!
request: WebResourceRequest // <- as well!
): Boolean {
return super.shouldOverrideUrlLoading(view, request)
}
}
В двух словах, мы НЕ ДОЛЖНЫ удалить ?
знак из аргументов функции, когда переопределенный метод определен в Java
классе.