generics - 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?
解决方案
您的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> {
推荐阅读
- windows - Internet Explorer 忽略 Flash mms.cfg 设置
- html - Chrome 和 Safari 中的 SVG foreignObject 渲染问题
- testing - 长生不老药测试失败,“原因:已经开始”
- node.js - 如何加密来自获取请求的响应?
- mediawiki - 如何使用 nginx 在 root 之外使用别名托管 Mediawiki 图像?
- python - PyGame,如何创建带有文本的按钮?
- git - Git:并行修复工作流程中的临时合并
- c++ - c++ 概念如何结合概念?
- python - FFT 信号的 Python 幅度
- laravel - 使用vuejs提交表单后如何清空字段并显示成功消息