Компилятор жалуется на неправильный тип, но он явно правильный - PullRequest
2 голосов
/ 21 июня 2019

У меня следующая проблема с Kotlin, вот мой код:

val dishesBitmaps: LiveData<List<Bitmap>> = liveData {
    val data = getDishesBitmaps()
    data?.let {
        emit(data)
    }
}

getDishesBitmaps() возвращает List<Bitmap>? однако компилятор показывает мне следующую ошибку

Вывод типа не удался.Ожидаемое несоответствие типов: предполагаемый тип - LiveData?>, Но LiveData> ожидался

, но data явно становится List<Bitmap> после проверки на ноль.Странно то, что он прекрасно компилируется, если я явно приводил его как emit(data as List<Bitmap>) (но снова IDE показывает, что приведение не требуется).

Это ошибка в компиляторе или я что-то делаю неправильно

Ответы [ 4 ]

1 голос
/ 21 июня 2019

но данные явно становятся List<Bitmap> после нулевой проверки

Компилятор может сделать умный бросок там, но я думаю, что в настоящее время это не так. Делать проще

if (data != null) { emit(data) }

должно работать. Обычная причина использовать ?.let вместо этого, если проверено значение var, которое здесь не применимо.

Причина, по которой работает emit(it), - параметр типа, выведенный для let.

Странно то, что он прекрасно компилируется, если я явно приведу его таким образом emit(data as List<Bitmap>) (но снова IDE показывает, что приведение не требуется).

Само по себе это не странно, в актерском составе вы говорите компилятору: «не имеет значения, что вы думаете о типе data, я знаю лучше». Он скомпилируется, даже если у вас будет data: Any?.

IDE, показывающая, что приведение не является необходимым, является странной частью и кое-что, что я бы посчитал ошибкой (которую вполне можно исправить, сделав приведение в действительности ненужным).

0 голосов
/ 21 июня 2019

Да, поскольку вы добавляете нулевую безопасность для данных

data? .Let {emit (data)}

Но тип возвращаемой вами функции не является нулевым, поэтомувам нужно добавить ? с функцией.Так что это может быть нулевое значение

val dishesBitmaps: LiveData<List<Bitmap>>? = liveData {
    val data = getDishesBitmaps()
    data?.let {
        emit(data)
    }
}
0 голосов
/ 21 июня 2019
data?.let {
    emit(data)
}

Этот блок кода переводится как

if (date != null) emit(data) else null

Если вы хотите вернуть нулевой объект безопасности, используйте elvis

data?.let {
    emit(data)
} ?: /**code if data is null**/
0 голосов
/ 21 июня 2019

Просто поместите ? после LiveData<List<Bitmap>>.Похоже, это обнуляется.Или вы можете оставить все как есть и изменить data? на data!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...