kotlin的函数关于可变参数使用vararg
前提:kotlin在编译的时候会转换成对应的java
一、java的可变参数类型:
java类型的类似: void func(Integer... values) {}
那么对应的kotlin的类型类似:fun func(vararg values: Int?) {}
注意:这里我使用的是Int? 是可空的意思,那么到java层的时候会转换成Integer, 如果不加? 到底层会转换成int; 是因为当kotlin
编译器认为形参不可为空的时候,完全可以用非包装
的类型来接受参数,更合理的利用资源。
二、kotlin传入的参数
1、针对vararg可变参数,kotlin 有两种不同的参数传递
fun testIntListArgs(vararg values: Int) { // kotlin编译器解析为int.. values类型 println(values.asList()) } val args = intArrayOf(4,5,6) // 因为是int... 的方式,所以这里必须用int[] 的类型 testIntListArgs(*args) // 使用*args的方式 testIntListArgs(4,5,6) // 使用可变参数传入的方式
如上,一种是使用*args的方式,一种是使用可变参数传入的方式
如果要强制编译器解析为包装类型的 Integer... values 则需要改为:vararg values: Int?
2、上述刚好使用可优化的Int,其他可使用非包装类型的参数也是会被kotlin编译器优化的
3、其他的包装类型则可以直接使用arrayOf()
fun testListStringArgs(vararg values: String) { println(values.asList()) } val strArr = arrayOf("aa", "bb") // 这里直接使用arrayOf testListStringArgs(*strArr)
4、因为是数组,所以不能使用listOf的方式, 如果非得要使用list的方式,则需要先转换为array: testListStringArgs(*strings.toTypedArray())
三、关于*args的java层操作
*args翻译成java之后,如果接收的函数解析成非包装类的话则不会执行copy操作,如果解析为包装类则会执行copy的操作
// 解析为非包装类 Integer[] var4 = new Integer[]{1, 2, 3}; testListArgs(var4); // 解析为包装类 Integer[] var2 = new Integer[]{4, 5, 6}; testListArgs((Integer[])Arrays.copyOf(var2, var2.length));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!