Это все о том, как Kotlin обрабатывает нули на границах с помощью кода Java.
Если вы передадите null из Java в метод Kotlin, который требует ненулевое значение, вы получите исключение. Это достигается с помощью вызовов функции Intrinsics.checkNotNull
, добавленной компилятором Kotlin в начале метода.
Например:
fun hello(who: String): Unit {
println ("Hello $who")
}
становится
public final void hello(@NotNull String who) {
Intrinsics.checkParameterIsNotNull(who, "who");
String var2 = "Hello " + who;
System.out.println(var2);
}
Аналогичная проверка добавлена при вызове методов Java из Kotlin.
Но в вашем случае у вас есть интерфейс Kotlin и его реализация в Java, сгенерированная Room.
Таким образом, компилятор Kotlin не может добавлять проверки, потому что он не имеет контроля над всеми реализациями интерфейса. В противном случае ему придется добавлять проверки после каждого вызова класса или интерфейса Kotlin, потому что это может быть реализовано в Java, что плохо сказывается на производительности.
UPD: обнаружена похожая проблема на Room bugtracker https://issuetracker.google.com/issues/112323132. Гуглер сказал, что это целевое поведение, и если вы написали запрос, который может возвращать нулевое значение, то вы обязаны пометить его как обнуляемый в интерфейсе dao.