为什么使用Observable Kotlin扩展功能会收到“推断类型为Observable <T?>!但预期为Observable <T>”的信息?

时间:2019-09-17 21:05:54

标签: kotlin extension-function

我具有以下扩展功能:

import io.reactivex.Notification
import io.reactivex.Observable
import io.reactivex.subjects.Subject

fun <T> Subject<Notification<T>>.fromNotifications(): Observable<T> {
    return compose {
        it.takeUntil { event ->
            !event.isOnNext
        }.flatMap { event ->
            when {
                event.isOnError -> Observable.error(event.error)
                event.isOnNext -> Observable.just(event.value)
                else -> Observable.empty()
            }
        }
    }
}

我用它将具有Subject值的Notification转换为普通Observable

我不太明白为什么会出现错误

Type inference failed. Expected type mismatch: inferred type is Observable<T?>! but Observable<T> was expected

inferred type is Observable<T?>来自哪里?我想这与以下事实有关:在Java中,可空类型和不可空类型之间没有区别。

有什么方法可以解决这个问题?

1 个答案:

答案 0 :(得分:2)

之所以会这样,是因为event.value被标记为@Nullable,所以Observable.just(event.value)Observable<T?>。您可以通过将返回类型更改为Observable<T?>或通过使用!!运算符断言event.value在创建Observable时不为null来进行编译(或通过其他方式处理明确显示为空值):

fun <T> Subject<Notification<T>>.fromNotifications(): Observable<T> {
    return compose {
        it.takeUntil { event ->
            !event.isOnNext
        }.flatMap { event ->
            when {
                event.isOnError -> Observable.error(event.error)
                event.isOnNext -> Observable.just(event.value!!)
                else -> Observable.empty()
            }
        }
    }
}