Android中FastAdapter添加多适配器遇类型推断失败问题求助
解决FastAdapter中类型推断失败的问题
我之前也踩过FastAdapter这个类型推断的坑,咱们来快速搞定它!
问题原因
你遇到的Type inference failed错误,本质是Kotlin编译器没法自动推断出两个适配器(AnimeItem和ProgressItem)的共同父类型。虽然这两个Item都继承自GenericItem(FastAdapter的基础Item接口),但编译器需要你显式告知这个通用类型,才能正确构建FastAdapter实例。
解决方案
有两种简单的方式可以解决这个问题:
方式一:显式指定FastAdapter的泛型参数
直接在with方法调用时,指定通用Item类型为GenericItem:
val animeAdapter = ItemAdapter<AnimeItem>() val footerAdapter = ItemAdapter<ProgressItem>() // 显式指定泛型参数为GenericItem var fastAdapter = FastAdapter.with<GenericItem>(listOf(animeAdapter, footerAdapter))
如果需要更严谨,也可以同时指定第二个适配器参数:
var fastAdapter = FastAdapter.with<GenericItem, IAdapter<*>>(listOf(animeAdapter, footerAdapter))
方式二:统一适配器的Item类型为GenericItem
把两个ItemAdapter的泛型都声明为GenericItem,这样编译器就能自动推断FastAdapter的类型:
// 统一使用GenericItem作为适配器的Item类型 val animeAdapter = ItemAdapter<GenericItem>() val footerAdapter = ItemAdapter<GenericItem>() // 添加Item时直接传入子类实例,完全兼容 animeAdapter.add(yourAnimeList.map { AnimeItem(it) }) footerAdapter.add(ProgressItem()) // 此时编译器能自动推断类型,无需额外指定 var fastAdapter = FastAdapter.with(listOf(animeAdapter, footerAdapter))
为什么这样有效?
FastAdapter的with方法要求所有传入的适配器都属于同一个通用Item类型的家族。显式指定GenericItem作为共同父类,或者让适配器统一使用这个父类型,就能让编译器明确知道要处理的Item类型范围,从而解决类型推断失败的问题。
内容的提问来源于stack exchange,提问作者faouzi Ch
相关产品推荐
相关产品推荐

