KMM项目中Reaktive转RxJava2 Single时泛型被识别为Object问题
解决KMM中Reaktive转RxJava2泛型丢失问题
问题原因
你遇到的强制转换问题,本质是Kotlin泛型到Java的传递过程中类型信息丢失,加上直接将SingleWrapper<List<String>>传入针对Reaktive Single<T>的扩展方法,导致Java编译器无法正确推断泛型参数T的具体类型,只能识别为Object。
解决方案
1. 为SingleWrapper编写专属互操作方法
既然共享模块返回的是SingleWrapper<T>,直接给这个包装类写扩展方法,确保泛型信息完整传递:
// 在Kotlin互操作文件中添加 fun <T : Any> SingleWrapper<T>.asRxJava2Single(): io.reactivex.Single<T> { // 假设SingleWrapper内部持有Reaktive的Single实例,字段名为single return this.single.asRxJava2Single() }
Java端调用时,泛型会被自动推断为List<String>,无需强制转换:
.flatMap(pair -> SingleInteropKt.asRxJava2Single(new SharedBookService().getAssignedBooks()) .map(list -> new Pair<>(pair, list)) // list自动识别为List<String> )
2. 优化原扩展方法的Java兼容性
如果需要保留针对Reaktive Single<T>的扩展,将其改为顶层函数并明确泛型声明,避免Java端推断失败:
@JvmName("asRxJava2SingleFromReaktive") fun <T : Any> asRxJava2SingleFromReaktive(reaktiveSingle: Single<T>): io.reactivex.Single<T> = object : io.reactivex.Single<T>() { override fun subscribeActual(observer: io.reactivex.SingleObserver<in T>) { reaktiveSingle.subscribe(observer.asReaktiveSingleObserver()) } }
Java端调用时,先从SingleWrapper中取出Reaktive的Single实例再转换:
.flatMap(pair -> SingleInteropKt.asRxJava2SingleFromReaktive( new SharedBookService().getAssignedBooks().getSingle() ).map(list -> new Pair<>(pair, list)) )
3. 检查SingleWrapper的泛型暴露
确保SingleWrapper的泛型参数没有被@JvmSuppressWildcards或其他注解隐藏,正确定义示例:
class SingleWrapper<T>(val single: Single<T>) { // 你的wrap逻辑 }
避免泛型被擦除或降级为Object。
4. 验证观察者转换方法的泛型正确性
检查asReaktiveSingleObserver扩展方法的泛型是否正确传递,确保它能将io.reactivex.SingleObserver<in T>正确转换为Reaktive的SingleObserver<T>:
fun <T : Any> io.reactivex.SingleObserver<in T>.asReaktiveSingleObserver(): SingleObserver<T> { return object : SingleObserver<T> { override fun onSuccess(value: T) = this@asReaktiveSingleObserver.onSuccess(value) override fun onError(error: Throwable) = this@asReaktiveSingleObserver.onError(error) override fun onSubscribe(disposable: Disposable) = this@asReaktiveSingleObserver.onSubscribe(disposable) } }
内容的提问来源于stack exchange,提问作者AndreiBogdan
相关产品推荐
相关产品推荐

