Kotlin的Reified類型:怎樣在函數內使用這一類型(KAD 14)

做者:Antonio Leivajava

時間:Mar 2, 2017android

原文連接:https://antonioleiva.com/reified-types-kotlin/安全

 

對於Java開發者來講,最懊惱的限制之一是,在用泛型時不可以直接地使用類型。框架

 

一般解決方法是以函數參數形式傳遞類,這使得代碼更復雜且缺少吸引力。ide

 

Kotlin中,多虧有了inline函數(咱們已經討論),咱們能夠用reified類型使咱們可以在函數內使用它們。函數

 

爲何會如此?你會明白的,你會喜歡它的。ui

 

Reified 類型

 

如我早前的論述,以reified修飾類型後,咱們就可以在函數內部使用相關類型了this

 

重要的是,使用內聯函數後,在其運行地方須要替換代碼來得到類型。事實上因爲Java虛擬機的限制,類型不能使用,而是跳過限制的「詭計」。spa

 

引導到一個活動(Activity

 

這是最典型的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>()

 

FindView類型轉換

 

部分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

相關文章
相關標籤/搜索