Kotlin中返回继承泛型类的具体类时类型不匹配问题求助
Kotlin泛型函数返回类型不匹配问题解决
问题根源
你定义的getMapper函数返回RFMFunction<T, Event>,但当匹配MClick::class.java分支时,返回的MClickMapper实际是RFMFunction<MClick, Event>类型。由于Kotlin编译器无法在编译期确认泛型参数T与MClick的等价性(尽管逻辑上完全成立),因此抛出类型不匹配错误。直接转换为RFMFunction<MClick, Event>无效,因为函数要求的返回类型是泛化的RFMFunction<T, Event>。
可行解决方案
方案1:保留原函数签名的修正
在匹配MClick::class.java分支后,将MClickMapper强制转换为RFMFunction<T, Event>。此时逻辑上可以确定T就是MClick,这个转换完全安全:
inline fun <reified T> getMapper(klass: Class<T>): RFMFunction<T, Event> = when (klass) { MClick::class.java -> MClickMapper as RFMFunction<T, Event> else -> throw RuntimeException("Unknown event type: $klass") }
方案2:利用reified特性简化实现
如果允许修改函数签名,可去掉klass参数,直接通过reified的T做类型判断,编译器能更精准地推断类型:
inline fun <reified T> getMapper(): RFMFunction<T, Event> = when (T::class) { MClick::class -> MClickMapper as RFMFunction<T, Event> else -> throw RuntimeException("Unknown event type: ${T::class}") }
补充说明
两种方案中的强制转换之所以安全,是因为进入对应分支时,泛型参数T必然与MClick类型一致,RFMFunction<MClick, Event>与RFMFunction<T, Event>本质是同一种类型,不存在类型风险。
内容的提问来源于stack exchange,提问作者Clovis
相关产品推荐
相关产品推荐

