Java中可變參數規則:
- 可變參數前面可以有其他參數,但是可變參數只能出現在參數列表的最后
- 用...代表可變參數,...位於變量類型和變量名之間
- 調用含有可變參數的方法時,編譯器為該可變參數隱式創建一個數組,在方法體中以數組的形式訪問可變參數
先來看看Java中的剩余參數是咋用的
public class TestVariableParemeters { public static void main(String[] args) { new TestVariableParemeters().addNumbers("liuliqianxiao", 1, 2, 3, 4, 5); } public int addNumbers(String name, int... args) { int result = 0; for (int i = 0; i < args.length; i++) { result += args[i]; } return result; } }
Kotlin中可變參數規則:
- 可變參數不必是函數的參數列表中的最后一個
- 用vararg paramName: paramType格式申明一個可變參數
- 和Java一樣,在函數體內部,可以以數組的形式使用這個可變參數的形參變量
先來看看我們用Kotlin重寫上面的addNumbers方法
fun main(args: Array<String>) { User().addNumbers("liuliqianxiao",1, 2, 3, 4, 5) } class User{ fun addNumbers(name: String, vararg args: Int): Int { var result = 0 // for (i in args.indices) { // result += args[i] // } for(it in args){ result += it } return result } }
不得不說idea真是非常智能,我將上述Java版的addNumbers方法直接拷貝粘貼到Kotlin文件中,立馬提示我是否要轉換成Kotlin代碼,點確定就能生成Kotlin版本的addNumbers方法了。
注釋掉的for循環就是自動生成的,但是我不想用它生成的那個版本,所以自己改寫了for循環,但是結果都是正確的。
上述規則中說了,可變參數不必是參數里列表中的最后一個,來看看這種情況,函數怎么調用:
fun main(args: Array<String>) { //調用的時候,給id賦值必須用命名參數形式 println(User().addNumbers("liuliqianxiao",1, 2, 3, 4, 5, id = 12345)) } class User{ //相對於上面加了最后一個固定參數id fun addNumbers(name: String, vararg args: Int, id: Int): Int { var result = 0 // for (i in args.indices) { // result += args[i] // } for(it in args){ result += it } return result } }
再來看一個接受多種類型參數的可變參數,只需將類型設成Any即可
fun main(args: Array<String>) { test(1,"Hello,Kotlin!",'a',User(1,"liuliqianxiao")) } //用Any代表任意類型 fun test(vararg args: Any){ for(it in args){ println(it) } } class User(var id: Int,var name: String){ override fun toString(): String { return "User(id=$id, name='$name')" } } //輸出結果 //1 //Hello,Kotlin! //a //User(id=1, name='liuliqianxiao')
關於Kotlin中可變參數就說到這里吧,說的不夠全面,想到哪里就說到哪里