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));
浙公网安备 33010602011771号