Вызов функции карты для Flowable типа Result вызывает исключение ClassCastException - PullRequest
1 голос
/ 01 июля 2019

Я пытаюсь сопоставить значения в Flowable типа Result с другим типом Result.В блоке карты я просто вызываю mapCatching для Result.Вместо того чтобы возвращать сопоставленное значение, он генерирует исключение ClassCastException.Я написал простой тест, чтобы проиллюстрировать мою проблему.

@Test
    fun test() {
        Flowable.just(Result.success(1))
                .map { result ->
                    result.mapCatching { input -> input.toString() }
                }
                .test()
                .values()
                .forEach {
                    println(it)
                }
    }

Это возвращает следующее исключение:

java.lang.ClassCastException: kotlin.Result$Failure cannot be cast to kotlin.Result

Редактировать: замена метода mapCatching на мой собственный код отображениязаставляет Flowable завершаться с другим ClassCastException:

@Test
    fun test() {
        Flowable.just(Result.success(1))
                .map { result ->
                    if (result.isFailure) {
                        return@map Result.failure<String>(result.exceptionOrNull()!!)
                    } else {
                        return@map Result.success(result.getOrNull()!!.toString())
                    }
                }
                .test()
                .errors()
                .forEach {
                    println(it)
                }
    }

Этот тест печатает следующее:

java.lang.ClassCastException: kotlin.Result cannot be cast to java.lang.Number

1 Ответ

0 голосов
/ 01 июля 2019

Класс Result является встроенным классом, и компилятор внутренне пытается преобразовать его в упакованный тип, где это возможно.Это прекрасно работает при вызове из кода Kotlin, но RxJava написан на Java.См. эту статью для получения дополнительной информации.

В этом случае мне удалось решить эту проблему, развернув классы Result в источнике и используя только обернутые типы.Ошибки были распространены и, наконец, обернуты в класс результата у подписчика.

Примерно так:

Flowable.just(1)
 .map { it.toString() }
 .map { Result.success(it) }
 .onErrorReturn { Result.failure(it) }
...