Kotlin集合泛型扩展函数如何返回调用者的具体实际类型?
解决方案
可以通过声明带边界的接收者泛型参数实现该需求,修改后的扩展函数如下:
fun <T, L : MutableList<T>> L.fillWith(default: T, targetSize: Int): L = apply { if (this is ArrayList<*>) { ensureCapacity(targetSize) } while (size < targetSize) add(default) }
原理说明
- 新增泛型参数
L,指定其上界为MutableList<T>,直接用L作为接收者类型和返回值类型 - 配合
apply函数返回调用对象本身的特性,调用函数后会直接返回接收者的原始具体类型,无需手动转型 - 同时修正了原代码的两处问题:补充了
ArrayList的泛型星投影避免编译警告,替换了未定义的newSize变量、调整参数名更易读
使用示例
你给出的用法仅需要修正第二行的类型匹配笔误即可正常运行:
// 可直接赋值给LinkedList类型变量 val data1 : LinkedList<String> = LinkedList<String>().fillWith("", 42) // 右侧传入ArrayList实例即可赋值给对应类型变量 val data2 : ArrayList<String> = ArrayList<String>().fillWith("", 42)
内容的提问来源于stack exchange,提问作者vach
相关产品推荐
相关产品推荐

