/**
* DESC : 动态参数 vararg
*/
const val KtBaseVarargTest01_TAG = "KtBaseVarargTest01"
class MultiArgClass<T>(val flag : Boolean, vararg objects : T) {
//out 表示T只能被读取,不能修改
private val objectArr : Array<out T> = objects
fun showObj(index: Int) : T? = objectArr[index].takeIf { flag } ?: null
fun <O> map(index: Int, mapAction: (T ?) -> O) = mapAction(objectArr[index].takeIf { flag })
}
class KtBaseVarargTest01 {
fun testVararg01() {
/**
* 由于使用太多的混合类型了,泛型真正的类型是MultiArgClass<{Comparable<*> & java.io.Serializable}>
* 因为不允许这样写MultiArgClass<{Comparable<*> & java.io.Serializable}>,所以使用MultiArgClass<Any?>代替
*/
val multiArgClass /*: MultiArgClass<Any?> */= MultiArgClass(true, "你好吗", 99, 99.8, 99.99, 'A', false)
val r1 = multiArgClass.showObj(0)
val r2 = multiArgClass.showObj(1)
val r3 = multiArgClass.showObj(3)
val r4 = multiArgClass.showObj(4)
/**
* testVararg01==>r1=你好吗
* testVararg01==>r2=99
* testVararg01==>r3=99.99
* testVararg01==>r4=A
*/
Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r1="+r1)
Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r2="+r2)
Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r3="+r3)
Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r4="+r4)
/**
* it的类型是{Comparable<*> & java.io.Serializable},需要转换一下才行
*/
val r5 = multiArgClass.map(1) {
//lambda表达式最后一行位返回值
"值为="+it
}
//testVararg01==>r5=值为=99
Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r5="+r5)
val r6 : String = multiArgClass.map(2) {
//it == objectArr[index]
//lambda表达式最后一行位返回值
"长度为="+it.toString().length
}
Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r6="+r6)
}
}
网友评论