在java中我们判断object是否为Class的实例是比较麻烦的一件事,kotlin中则使用了Reified关键字来简化我们的工作。
看下官方给的例子:
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
注意:非内联函数是无法使用reified的,因为它能判断在运行时表示的类型。这种时候还需要老老实实的使用反射来实现。
举例
1.startActivity
inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
//直接调用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)
网友评论