Kotlin泛型类型检查问题:如何实现针对Number类型列表的特定逻辑处理函数
解决Kotlin泛型函数识别Number类型列表的问题
你的问题核心在于具体化泛型的条件判断逻辑不对——当你传入listOf(1,2,3)时,泛型参数T实际是Int(而非Number),所以T::class == Number::class的判断永远不成立,自然不会执行切片逻辑。
修正方案:检查泛型类型是否为Number的子类
我们可以利用Kotlin反射的isSubtypeOf方法,判断具体化的T是否是Number类(或其子类),这样就能覆盖所有Number的实现类(比如Int、Double、Long等):
inline fun <reified T> listOfNumbers(list: List<T>): List<T> { return if (T::class.isSubtypeOf(Number::class)) { list.slice(0..list.lastIndex step 2) as List<T> } else { list } }
另一种思路:检查列表元素的实际类型
如果你不想依赖反射的isSubtypeOf,也可以直接检查列表中的元素是否属于Number类型(Kotlin的List<T>保证了所有元素都是T类型):
inline fun <reified T> listOfNumbers(list: List<T>): List<T> { return if (list.isNotEmpty() && list.first() is Number) { list.slice(0..list.lastIndex step 2) as List<T> } else { list } }
不过这种方法要注意空列表的情况——如果传入空的Number列表,会直接返回原列表,你可以根据需求调整空列表的处理逻辑。
测试验证
运行你的测试代码:
fun main() { println(listOfNumbers(listOf(1, 2, 3, 4, 5))) println(listOfNumbers(listOf("1", "2", "3", "4", "5"))) }
现在会得到期望的结果:
[1, 3, 5] [1, 2, 3, 4, 5]
为什么原来的代码不生效?
再回顾一下问题:Kotlin的具体化泛型虽然能在运行时获取T的实际类型,但当你传入List<Int>时,T是Int,而Int::class和Number::class是不同的KClass实例,所以when中的条件永远匹配不到Number::class。用isSubtypeOf就能正确判断Int是Number的子类,从而触发切片逻辑。
内容的提问来源于stack exchange,提问作者ispite
相关产品推荐
相关产品推荐

