Я изучаю Kotlin и пытаюсь использовать LiveData с ним.Поскольку библиотека LiveData написана на Java, Kotlin должен поддерживать преобразования SAM.
LiveData
класс имеет метод observe
с двумя аргументами, Observer
и LifecycleOwner
:
void observe (LifecycleOwner owner, Observer<T> observer)
Оба являются интерфейсами с одним методом.Когда я использую лямбду SAM для обоих аргументов, она работает нормально:
val liveData = MutableLiveData<Int>()
liveData.observe({ lifecycleOwner.lifecycle }, { invokeMyMethod(it) })
Также она работает, когда я предоставляю объект и лямбда SAM с определенным типом (Observer
):
val liveData = MutableLiveData<Int>()
liveData.observe(lifecycleOwner, Observer { invokeMyMethod(it) })
Однако, когда я пытаюсь использовать объект для одного аргумента и SAM лямбда без типа для другого аргумента:
val liveData = MutableLiveData<Int>()
liveData.observe(lifecycleOwner, { invokeMyMethod(it) })
, это дает мне ошибку компиляции.Но почему я не могу написать такой код?Это именно то, что я хочу, компактный и без шаблонного кода.В LiveData
есть только один метод observe
, поэтому я должен указать тип лямбды?
Компилятор выдает такую ошибку:
Несоответствие типов.Требуется: Наблюдатель!>, Найдено: () → Юнит
Небольшое обновление, я только что проверил эту комбинацию, и она также не работает:
val liveData = MutableLiveData<Int>()
liveData.observe({ lifecycleOwner.lifecycle }, Observer { invokeMyMethod(it) })
Итакработает, когда оба аргумента являются лямбда-выражениями SAM, но не работает, когда один - лямбда-SAM, а другой - лямбда-SAM с указанным типом.В этом случае компилятор также выдает ту же ошибку Type mismatch
.