reified關鍵字是用于Kotlin內聯(lián)函數(shù)的,修飾內聯(lián)函數(shù)的泛型,泛型被修飾后,在方法體里,能從泛型拿到泛型的Class對象,這與java是不同的,java需要泛型且需要泛型的Class類型時,是要把Class傳過來的,但是kotlin不用了,具體的參見 下面這篇博客:
kotlin學習筆記——泛型及reified函數(shù)(http://m.itdecent.cn/p/bbe694b2c0a8)
<meta charset="utf-8">
下面我們再來說說reified函數(shù),它與泛型密切相關
比如我們啟動一個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,可以更簡單的實現(xiàn)
startActivity<DetailActivity>(DetailActivity.ID to item.id, DetailActivity.NAME to item.name)
我們知道在java中使用泛型的時候,無法通過泛型來得到Class,一般我們會將Class通過參數(shù)傳過去。
在kotlin中一個內聯(lián)函數(shù)(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的內聯(lián)函數(shù),所以要在Context類中才可以使用,在其他地方使用則需要使用with函數(shù):
with(context){
startActivity<...>(...)
}