kotlin的函数关于可变参数使用vararg

发布时间 2023-10-15 16:36:59作者: LCAC

前提: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())