做者:Antonio Leivajava
時間:Mar 2, 2017android
原文連接:https://antonioleiva.com/reified-types-kotlin/安全
對於Java開發者來講,最懊惱的限制之一是,在用泛型時不可以直接地使用類型。框架
一般解決方法是以函數參數形式傳遞類,這使得代碼更復雜且缺少吸引力。ide
在Kotlin中,多虧有了inline函數(咱們已經討論過),咱們能夠用reified類型使咱們可以在函數內使用它們。函數
爲何會如此?你會明白的,你會喜歡它的。ui
如我早前的論述,以reified修飾類型後,咱們就可以在函數內部使用相關類型了。this
重要的是,使用內聯函數後,在其運行地方須要替換代碼來得到類型。事實上因爲Java虛擬機的限制,類型不能使用,而是跳過限制的「詭計」。spa
這是最典型的Android應用案例。code
在Java中,咱們調用startActivity時,咱們須要以參數形式指明目的類。
在Kotlin中,咱們可以經過添加類型傳遞給函數來簡化這個操做:
1 inline fun <reified T : Activity> Activity.startActivity() { 2 startActivity(Intent(this, T::class.java)) 3 }
如今,引導一個Activity就能夠如此簡單:
1 startActivity<DetailActivity>()
部分Android開發人員使用Java十分有益的方式是用泛型經過變量賦值結果返回對象類型。
在Java中,你能夠產生這樣的一個函數:
1 public <T extends View> T findView(Activity activity, int id) { 2 return (T) activity.findViewById(id); 3 }
而後用它返回對象類型:
1 TextView textView = Utils.findView(activity, R.id.welcomeMessage);
在Kotlin中,作法有些相似,可是因爲有了擴展函數就更加容易:
1 fun <T : View> Activity.findView(id: Int) = findViewById(id) as T 2 3 val textView = activity.findView<TextView>(R.id.welcomeMessage)
可是,你會發現這種狀況,因爲沒有訪問T類型,編譯器都不能肯定有效類型,因此編譯器會給出警告。
用了reified類型,就能夠避免這種狀況:
1 inline fun <reified T : View> Activity.findView(id: Int) = findViewById(id) as T
用reified類型,你可以作一些在Java中不可能實現的事情,甚至能夠作一些更安全的函數。
如今,你能夠避免將類的類型做爲自變量傳遞給你的函數了。
此外,因爲有了擴展函數,你可以在框架(如Android)上建立新函數了。在Android的API中有些部分已經使用這個方法(如startActivity方法)。
若是你要開始用Kotlin開發你本身的APP,我建議你閱讀免費指南和Android開發者的Kotlin書。