Kotlin泛型类组成的List出现类型不匹配,无需强转如何解决
问题原因
你使用了out协变投影声明ClaseA的泛型参数,而Kotlin中out T协变投影的语义是该泛型参数仅作为生产者(方法返回值类型)使用,不能出现在消费者(方法入参)位置。
你定义的otherMethod方法刚好将两个泛型参数作为入参使用,属于消费场景,因此编译器会将out投影后的泛型参数的入参位置限制为Nothing类型,自然无法传入任何实际参数,触发类型不匹配报错。
解决方案
根据你的业务场景可选择以下任意一种无强制类型转换的方案:
方案1:列表仅存储同泛型参数的ClaseA实例
如果你的列表只会存相同泛型参数的ClaseA实现,直接写死列表的泛型类型即可:
// 直接指定明确的泛型参数,不需要投影 val list: MutableList<ClaseA<HijoB, HijoC>> = mutableListOf()
修改后原有调用逻辑无需任何改动即可正常运行。
方案2:封装泛型校验逻辑到接口内部
如果你的列表需要存储不同泛型参数的ClaseA实现,可在ClaseA接口内新增通用调用方法,内部完成类型校验,外部无需感知泛型细节:
interface ClaseA<I: ClaseB, V: ClaseC> { fun otherMethod(item: I, holder: V) // 新增通用调度方法,内部做类型校验 fun dispatchOtherMethod(item: ClaseB, holder: ClaseC) { if (item is I && holder is V) { otherMethod(item, holder) } } }
遍历列表时直接调用新增的调度方法即可:
list.forEach { item -> item.dispatchOtherMethod(hijoB, hijoC) }
该方案完全规避了外部类型转换,同时保证了类型安全。
内容的提问来源于stack exchange,提问作者DejaVu
相关产品推荐
相关产品推荐

