如何用泛型参数声明函数合并相似的Kotlin列表处理函数
当然可以用单一泛型函数解决重复代码问题!
你遇到的情况是典型的泛型适用场景——两个函数逻辑完全一致,只是处理的列表元素类型不同,这时用泛型函数就能完美复用代码,同时保持类型安全。
为什么MutableList<Any>?不行?
首先得解释下为什么你尝试的MutableList<Any>?不被接受:Kotlin的泛型默认是不变的,也就是说MutableList<String>并不是MutableList<Any>的子类型。如果允许这样的转换,你可能会不小心往原本只能存String的列表里加入Int元素,破坏类型安全,所以编译器会直接拒绝这种写法。
解决方案:泛型函数
只需要把函数定义改成泛型版本,就能兼容任意类型的MutableList:
fun <T> displayTotalSelected(btn: ListItemButton, items: MutableList<T>?, resId: Int) { // 用Kotlin标准库的isNullOrEmpty()替代手动判断,更简洁规范 btn.text = if (items.isNullOrEmpty()) { getString(resId) } else { "${getString(resId)} (${items.size})" } }
怎么使用这个函数?
调用的时候完全不需要额外操作,编译器会自动根据你传入的列表类型推断出T的具体类型:
// 传入MutableList<String> displayTotalSelected(btn, stringList, R.string.some_res_id) // 传入MutableList<Int> displayTotalSelected(btn, intList, R.string.another_res_id)
这样你就不用维护两个几乎一模一样的函数了,代码更简洁也更易维护~
内容的提问来源于stack exchange,提问作者Big Star
相关产品推荐
相关产品推荐

