You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 08:59:35