在java中我們判斷object是否為Class的實例是比較麻煩的一件事,kotlin中則使用了Reified關(guān)鍵字來簡化我們的工作躯护。
看下官方給的例子:
fun <T> TreeNode.findParentOfType(clazz: Class<T>): T? {
var p = parent
while (p != null && !clazz.isInstance(p)) {
p = p.parent
}
@Suppress("UNCHECKED_CAST")
return p as T?
}
使用反射比較麻煩惊来,使用reified的之后看起來能更加明了:
inline fun <reified T> TreeNode.findParentOfType(): T? {
var p = parent
while (p != null && p !is T) {
p = p.parent
}
return p as T?
}
同樣是判斷p是否為T類型,我們能像普通類一樣使用is
,as
注意:非內(nèi)聯(lián)函數(shù)是無法使用reified的棺滞,因為它能判斷在運行時表示的類型裁蚁。這種時候還需要老老實實的使用反射來實現(xiàn)。
舉例
1.startActivity
inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
//直接調(diào)用Activity即可
startActivity<TargetActivity>()
2.findViewById
inline fun<T :View> Activity.findView(id: Int) = findViewById(id) as T
val textView = activity.findView<TextView>(R.id.tv)