首页 > 解决方案 > Kotlin:接口泛型类型 T 和参数对象类型 T 之间的类型不匹配

问题描述

作为更好地理解 ReactiveX 的练习,我正在尝试在 Kotlin 中实现 ReactiveX 的基础知识(由此处的 RxJs 示例指导)。我认为我目前得到的想法背后的想法是正确的,但我被一个我无法理解的实现细节所困扰。

这是观察者界面:

interface Observer<T> {

    fun next(data: T)

    fun error(e: Throwable)

    fun complete()
}

这是Observable接口:

interface Observable<T> {
    fun subscribe(observer: Observer<T>)

    fun <T, R> map(transformer: (input: T) -> R): Observable<R> {
        val inputObservable = this
        val outputObservable = object : Observable<R> {
            override fun subscribe(outputObserver: Observer<R>) {
                inputObservable.subscribe(object : Observer<T> {
                    override fun next(data: T) {
                        val y = transformer(data)
                        outputObserver.next(y)
                    }

                    override fun error(e: Throwable) {
                        outputObserver.error(e)
                    }

                    override fun complete() {
                        outputObserver.complete()
                    }
                })
            }

        }
        return outputObservable
    }
}

我遇到的错误在以下行中:

inputObservable.subscribe(对象:观察者{

我收到以下错误:

Type mismatch: inferred type is Observable<T#2 (type parameter of observable.Observable)> but Observable<T#1 (type parameter of observable.Observable.map)> was expected

我认为我的问题与这个问题非常相似。如果我是正确的,来自 Observable 接口的类型 T 没有链接到观察者的类型 T(这导致 T#1 和 T#2)。在那个问题中,解决方案是在 Interface 和 class 声明中使用 T ,但我看不到如何定义object的类型。

我的推理正确吗?我怎样才能链接这两个T?

标签: genericskotlin

解决方案


您的map()方法应该有一个通用参数:R. 它是已经是泛型的接口的一部分,并且已经具有泛型类型T。因此,使其泛型T也引入了一种T隐藏接口的泛型类型的泛型类型T

TL;博士:

fun <T, R> map(transformer: (input: T) -> R): Observable<R> {

应该

fun <R> map(transformer: (input: T) -> R): Observable<R> {

推荐阅读