reified
关键字是用于Kotlin内联函数的,修饰内联函数的泛型,泛型被修饰后,在方法体里,能从泛型拿到泛型的Class对象,这与java是不同的,java需要泛型且需要泛型的Class类型时,是要把Class传过来的,但是kotlin不用了,具体的参见 下面这篇博客:
kotlin学习笔记——泛型及reified函数(https://www.jianshu.com/p/bbe694b2c0a8)
<meta charset="utf-8">
下面我们再来说说reified函数,它与泛型密切相关
比如我们启动一个activity代码:
val intent = Intent(MainActivity@this, javaClass<DetailActivity>)
intent.putExtra(DetailActivity.ID, item.id)
intent.putExtra(DetailActivity.NAME, item.name)
startActivity(intent)
anko给我们提供了一个reified function,可以更简单的实现
startActivity<DetailActivity>(DetailActivity.ID to item.id, DetailActivity.NAME to item.name)
我们知道在java中使用泛型的时候,无法通过泛型来得到Class,一般我们会将Class通过参数传过去。
在kotlin中一个内联函数(inline)可以被具体化(reified),这意味着我们可以得到使用泛型类型的Class。
startActivity的源码如下:
public inline fun <reified T: Activity> Context.startActivity(
vararg params: Pair<String, String>) {
val intent = Intent(this, T::class.javaClass)
params forEach { intent.putExtra(it.first, it.second) }
startActivity(intent)
}
可以看到使用T::class.javaClass就可以得到使用泛型类型的Class。
startActivity是Context的内联函数,所以要在Context类中才可以使用,在其他地方使用则需要使用with函数:
with(context){
startActivity<...>(...)
}