Передать null в ненулевой метод Java из Kotlin

Предположим, что есть библиотека Java, которая объявлена ​​как @NonNullApi, но некоторые ее методы на самом деле могут использовать параметр null.

Есть ли способ проигнорировать требование о ненулевости и передать null туда из Котлина?

UPD Необходимо уточнить: метод объявлен сторонней библиотекой как ненулевой, нет возможности изменить его код. Цель состоит в том, чтобы снять ограничение с вызывающей стороны.

Очевидный способ — использовать Reflection, но, может быть, Kotlin предоставляет для этого только синтаксис?


person Adamovskiy    schedule 18.11.2019    source источник
comment
Аннотировать параметр с помощью @Nullable   -  person killjoy    schedule 18.11.2019
comment
Вы имеете в виду объявление параметра? Это сторонняя библиотека, изменить ее нельзя.   -  person Adamovskiy    schedule 18.11.2019
comment
Что это за библиотека? В какой метод вы хотите передать null?   -  person killjoy    schedule 18.11.2019
comment
Если в библиотеке ошибка, из-за которой этот параметр не может принимать значение null, вы можете написать метод Java, который принимает значение null и передает его в библиотеку, и вызывать этот метод Java из Kotlin.   -  person JB Nizet    schedule 18.11.2019


Ответы (2)


Как указывает другой ответ здесь, лучше не преодолевать контракт с нулевым значением функции Java, выраженный с помощью аннотаций с нулевым значением.

Но если вы действительно считаете, что эти аннотации появились по ошибке, вы можете использовать следующий обходной путь:

  • Объявите вспомогательную статическую функцию в служебном классе Java рядом с кодом Kotlin. Эта функция не имеет аннотации NonNull для тех параметров, где вам нужно передать null, и просто перенаправляет их в рассматриваемый метод. Компилятор Java не предотвращает вызов этого метода, даже если аннотации, допускающие значение NULL, не совпадают.
  • Импортируйте эту статическую вспомогательную функцию в Kotlin и вызывайте ее оттуда.
person Ilya    schedule 18.11.2019
comment
Спасибо! Конечно, этот хак не следует использовать для хорошо спроектированного API. Печально, что для такой простой вещи требуется столько кода. - person Adamovskiy; 18.11.2019
comment
@AlexeyAdamovskiy хорошо, ... я думаю, что лучше так (так много кода), чем по-другому (имея простое исправление для этого) ... разработчик библиотеки не хочет принимать здесь null-значения ... что функция работает с null значениями может быть просто совпадением... и если это ошибка и null нужно принять, то вам лучше связаться с этим разработчиком библиотеки... - person Roland; 19.11.2019

Отчетливое отсутствие ответа: не делайте этого!

В этой документации API сказано: не отправляйте null таким образом.

Даже если сегодняшняя реализация не ругает вас за передачу null, кто говорит, что это не ошибка и что она не будет исправлена ​​в какой-то следующей версии этой библиотеки?

Другими словами: напишите свой код, соответствующий указанному API.

Когда реализация библиотеки более щедра, чем спецификация API, лучше следовать более строгим правилам. Вы даже должны подумать о том, чтобы написать отчет об этой библиотеке.

person GhostCat    schedule 18.11.2019