Intereting Posts
Получение информации KProperty изнутри делегированной собственности вне функций getValue () и setValue () Как получить Kotlin KClass из строки имени класса пакета? Имеет ли Kotlin эквивалент Unplicitly Unwrapped Optionals в Swift? Как создать построитель для класса данных Kotlin со многими неизменяемыми свойствами Определение общих свойств без наследования Kotlin Coroutines: Нужно ли синхронизировать общее состояние? Как настроить динамические опорные точки для поворота анимации Класс данных Kotlin: как читать значение свойства, если я не знаю его имени во время компиляции? Конструктор Котлин с суперклассом Константы в Котлине – какой рекомендуемый способ их создать? Выделенный объект с помощью метода Mockito Kotlin без обрушения Альфа-анимация ViewPropertyAnimator не работает Как добавить библиотеки в программу kotlin? Vertx plus Kotlin coroutines вечно вешает Почему Котлин не следил за синтаксисом Java?

Как я могу переопределить java-метод и изменить значение nullability параметра?

Я переопределяю метод из библиотеки Java, а параметр для функции аннотируется как @NonNull . Однако, когда метод вызывается, параметр часто приходит с null значением. Когда я переопределяю метод в Kotlin, он заставляет меня уважать аннотацию @NonNull и отмечать параметр как недействительный. Конечно, Kotlin генерирует исключение во время выполнения, когда параметр приходит с нулевым значением. Есть ли способ переопределить метод в Kotlin и игнорировать аннотацию @NonNull ?

В частности, я использую библиотеку appcompat для Android. Этот метод находится в AppCompatActivity.java

 @CallSuper public void onSupportActionModeFinished(@NonNull ActionMode mode) { } 

Переопределение в Котлине:

 override fun onSupportActionModeFinished(mode: ActionMode) { super.onSupportActionModeFinished(mode) } 

Кажется, нет простого способа подавить обработку аннотаций с помощью NULL компилятором Kotlin.

В качестве обходного пути вы можете создать промежуточный производный класс с @Nullable аннотацией в Java: когда компилятор Kotlin видит как @Nullable и @NonNull на одном и том же элементе кода, он ведет себя так, как будто аннотации с нулевыми значениями отсутствуют. Тогда просто подклассируем его в Котлине. Пример:

Рассмотрим класс с параметром @NonNull в Java:

 abstract class Base { public abstract void f(@NonNull String str); //... } 

Котлин понимает аннотацию: f(str: String) , тип не нуль.

Теперь добавьте Base в Java, переопределите метод и добавьте @Nullable аннотацию к параметру в Intermediate :

 abstract class Intermediate extends Base { @Override public abstract void f(@Nullable String str); } 

Для Intermediate Kotlin видит f(str: String!) , Параметр имеет тип платформы , т. Е. Его неопределенность неизвестна.

После этого вы сможете объявить параметр NULL в подклассе Kotlin Intermediate :

 class Derived(): Intermediate() { override fun f(url: String?) { ... } }