Kotlin中如何将可变参数(varargs)传递给接收Array<String>类型参数的函数
Kotlin中如何将可变参数(varargs)传递给接收Array类型参数的函数
嘿,这个问题我之前在项目里也踩过坑!其实问题出在Kotlin对可变参数的类型处理上——当你在函数里用vararg声明参数后,这个参数在函数内部的实际类型是Array<out String>(也就是协变数组),而第三方库的foo函数要求的是不可变的Array<String>类型,所以直接传就会触发那个类型不匹配的编译错误。
因为你改不了foo的签名,给你两个安全可行的解决办法:
方法一:安全强转+抑制警告
既然你明确知道foo只会读取数组内容、不会修改它,那直接把vstrings强转成Array<String>是完全安全的。只需要加个注解消除Kotlin的类型安全警告就行:fun bar(vararg vstrings: String) { // 你的前置逻辑 @Suppress("UNCHECKED_CAST") foo(vstrings as Array<String>) // 你的后置逻辑 }原理是:
vstrings本质上就是String类型的数组,Kotlin给它协变类型只是为了防止你不小心做不安全的写入操作,既然foo只读,强转完全没问题。方法二:复制数组
如果你不想用强转,也可以创建原数组的副本,copyOf()方法会返回一个Array<String>类型的新数组,直接传给foo就行:fun bar(vararg vstrings: String) { // 你的前置逻辑 foo(vstrings.copyOf()) // 你的后置逻辑 }这个方法的好处是不需要写注解,代码看起来更“干净”,唯一的小缺点是会创建一个新数组,带来一点点可忽略的内存开销,对于大多数场景来说完全不是问题。
简单说下为什么会有这个错误:Kotlin的Array<out T>是协变的,只能从中读取T类型的值,不能往里面写;而Array<String>是可以读写的,所以Kotlin默认不允许直接转换,除非你明确告诉编译器“我确认这么做是安全的”。
备注:内容来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

