//Kotlin中泛型与vararg可变参数的使用
class KtBase10<T>(vararg objects: T, var isMap: Boolean) {
//out 这里的T只能被读取,不能修改
private val objectArray: Array<out T> = objects
fun showObj(index: Int): T? = objectArray[index].takeIf { isMap } ?: null
fun <O> mapObj(index: Int, mapAction: (T?) -> O): O? = mapAction(objectArray[index].takeIf { isMap })
// fun <O> mapObj(index: Int, mapAction: (T?) -> O): O? {
// return mapAction(objectArray[index].takeIf { isMap })
// }
}
fun main(args: Array<String>) {
val p: KtBase10<Any?> = KtBase10("yuknight", 123, 22.1f, null, 'A', isMap = true)
println(p.showObj(0))
println(p.showObj(1))
println(p.showObj(2))
println(p.showObj(3))
println(p.showObj(4))
println()
var r: Any? = p.mapObj(0) {
it.toString().length
}
println(r)//8
var r1 = p.mapObj(1) { obj: Any? ->
// obj.toString().length
"第二个参数是:$obj"
}
println(r1)//第二个参数是:123
//
val p2: KtBase10<String> = KtBase10("AAA", "BBB", "CCCC", isMap = true)
val r3 = p2.mapObj(0){
it
"转成String类型:$it"
}
println(r3)//转成String类型:AAA
val r4 = p2.mapObj(2){
str: String? -> "转成String类型:$str"
}
println(r4)//转成String类型:CCCC
}