Первый вопрос, который вы должны задать перед тем, как приблизиться к сложностям Kotlin, таким как переработанные дженерики, это: почему я могу это сделать?
val x = MutableLiveData<Int>()
x.value = null
и ответ на , что коренится в том, что MutableLiveData
написано на Java, а не на Kotlin.
Если вы написали этот класс на Kotlin:
class MyKotlinClass<T: Any> {
lateinit var value: T
}
, а затем попытались сделать это:
val x = MyKotlinClass<Int>()
x.value = null
тогда не скомпилируется. Это потому, что вы определили тип как ненулевой Any
.
Но представьте себе, что вы пишете такой универсальный класс в Java, где Any
равен Object
, и вы не можете определить обнуляемость ни для чегона самом деле, за исключением предоставления аннотаций:
class ExampleJavaClass<T> {
public ExampleJavaClass(T param) {
}
static ExampleJavaClass getStringInstance() {
return new ExampleJavaClass<String>(null);
}
}
Это разрешено. Таким образом, чтобы разрешить полностью совместимое взаимодействие с Java, Котлин должен предположить, что пустые значения в порядке. К сожалению для вас, это невидимо.
Пока кто-то не создаст специфичную для Kotlin реализацию LiveData, которая ужесточит это, вам придется иметь дело с нулем, или вы можете написать его самостоятельно, например, this . Я бы не стал поощрять написание вашего собственного - это может иметь неблагоприятные последствия.
Во многих случаях, если вы владеете кодом Java, вы можете улучшить ситуацию взаимодействия, добавив в Java аннотацию для определения допускаемой обнуляемости, например @NonNull
. Однако не похоже, что вы можете сделать это, используя существующие аннотации к параметрам типа.