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

相关文章
相关标签/搜索