/**
* DESC : reified关键字(具体化)备用机制
*/
const val KtBaseReifiedTest01_TAG = "KtBaseReifiedTest01"
data class ObjectClass01(val name: String, val age: Int)
data class ObjectClass02(val name: String, val age: Int)
data class ObjectClass03(val name: String, val age: Int)
data class ObjectClassDefault(val name: String, val age: Int)
class KtBaseReifiedTest01 {
inline fun <reified T> testReified01(defaultLambdaAction : () -> T) : T? {
val objectList : List<Any> = listOf(ObjectClass01("zhangsan", 10),
ObjectClass02("lisi", 11), ObjectClass03("wangwu", 12))
val randomObj : Any? = objectList.shuffled().first()
//testReified01==>objClass=ObjectClass03(name=wangwu, age=12)
//testReified01==>objClass=ObjectClass01(name=zhangsan, age=10)
Log.d(KtBaseReifiedTest01_TAG, "testReified01==>randomObj="+randomObj)
//如果objClass为空,备用返回defaultLambdaAction()方法返回的对象(因加入了reified关键字)
//1.类型转换as T和as T?是不同的,
//2.randomObj is T如果返回false,那么randomObj.takeIf也会返回null,
//3.如果as T不加问号,接着判断null as T会奔溃(null 不能转换成 T 类型),所以防止崩溃,改成as T?
//2.改成as T?后,接着2步骤,null as T?可为空,走defaultLambdaAction逻辑
return randomObj.takeIf { randomObj is T } as T? ?: defaultLambdaAction()
}
}
网友评论