前提: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())
标签:vararg,Int,kotlin,使用,参数,可变,values From: https://www.cnblogs.com/czwlinux/p/17765773.html