Kotlin的Reified类型:怎样在函数内使用这一类型(KAD 14)

时间:Mar 2, 2017
原文链接:https://antonioleiva.com/reified-types-kotlin/
对于Java开发者来说,最懊恼的限制之一是,在用泛型时不能够直接地使用类型。
通常解决方法是以函数参数形式传递类,这使得代码更复杂且缺乏吸引力。
在Kotlin中,多亏有了inline函数(我们已经讨论过),我们可以用reified类型使我们能够在函数内使用它们。
为什么会如此?你会明白的,你会喜欢它的。
Reified 类型
如我早前的论述,以reified修饰类型后,我们就能够在函数内部使用相关类型了。
重要的是,使用内联函数后,在其运行地方需要替换代码来获得类型。事实上由于Java虚拟机的限制,类型不能使用,而是跳过限制的“诡计”。
引导到一个活动(Activity)
这是最典型的Android应用案例。
在Java中,我们调用startActivity时,我们需要以参数形式指明目的类。
在Kotlin中,我们能够通过添加类型传递给函数来简化这个操作:
inline fun <reified T : Activity> Activity.startActivity() {
startActivity(Intent(this, T::class.java))
}
现在,引导一个Activity就可以如此简单:
startActivity<DetailActivity>()
FindView类型转换
部分Android开发人员使用Java十分有益的方式是用泛型通过变量赋值结果返回对象类型。
在Java中,你可以产生这样的一个函数:
public <T extends View> T findView(Activity activity, int id) {
return (T) activity.findViewById(id);
}
然后用它返回对象类型:
TextView textView = Utils.findView(activity, R.id.welcomeMessage);
在Kotlin中,做法有些类似,但是由于有了扩展函数就更加容易:
fun <T : View> Activity.findView(id: Int) = findViewById(id) as T val textView = activity.findView<TextView>(R.id.welcomeMessage)
但是,你会发现这种情况,由于没有访问T类型,编译器都不能确定有效类型,所以编译器会给出警告。
用了reified类型,就可以避免这种情况:
inline fun <reified T : View> Activity.findView(id: Int) = findViewById(id) as T
结论
用reified类型,你能够做一些在Java中不可能实现的事情,甚至可以做一些更安全的函数。
现在,你可以避免将类的类型作为自变量传递给你的函数了。
此外,由于有了扩展函数,你能够在框架(如Android)上创建新函数了。在Android的API中有些部分已经使用这个方法(如startActivity方法)。
如果你要开始用Kotlin开发你自己的APP,我建议你阅读免费指南和Android开发者的Kotlin书。
Kotlin的Reified类型:怎样在函数内使用这一类型(KAD 14)的更多相关文章
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
来自:http://www.cnblogs.com/lcxu2/archive/2011/01/16/2004016.html 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或 ...
- python之类的多态(鸭子类型 )、封装和内置函数property
一.多态 1.什么是多态:一个类表现出的多种状态--->通过继承来实现的例如:class Animal:passclass Dog(Animal):passclass Cat(Animal):p ...
- Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...
- golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值
不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) { return } 通过 ...
- 《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式
函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...
- T-SQL编程 —— 用户自定义函数(内嵌表值函数)
内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以 ...
- python 类型判断-- isinstance函数
判断类型 函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str.list.dict,也可以用在我们自定义的类,它们本质上都是数据类型. 假设有如下的 Per ...
- Python入门之函数的介绍/定义/定义类型/函数调用/Return
本篇目录: 一. 函数的介绍 二. 函数的定义 三. 定义函数的三种类型 四. 函数调用的阶段 五. Return返回值 ======================================= ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
随机推荐
- linux下重新启动oracle
第一步.以Oracle帐户进入Linux系统 第二步.执行以下命令查看数据库监听器的状况: lsnrctl status 或者查看数据库端口是否被监听(默认1521) netstat -ano | g ...
- Mbatis错误信息整理
***每存在一对接口和xml文件,必须在xml文件中定义好mapper标签及namespace ***每对接口必须和xml文件名必须一致 <mapper>标签中的names ...
- 为什么你的 App 没人用?请按这8条逐一对照
为什么你的 App 没人用?请按这8条逐一对照 Kamo Asatryan 可能是这个世界上关注创新生态系统最多的一些人之一,他观察过数百个移动端 App,深入思考过它们的运行机制,并为它们的快速增长 ...
- 统计iOS产品不同渠道的下载量
如何统计iOS产品不同渠道的下载量? 一.前言 在开发过程中,Android可能会打出来很多的包,用于标识不同的商店下载量.原来觉得苹果只有一个商店:AppStore,如何做出不同来源的统计呢?本篇文 ...
- ABAP术语-Business Object Builder
Business Object Builder 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/09/1031357.html Tool fo ...
- 《Linux 性能优化实战—倪朋飞 》学习笔记 CPU 篇
平均负载 指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,即平均活跃进程数 可运行状态:正在使用CPU或者正在等待CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态 (Run ...
- (转)Dubbo 简单Dome搭建
(转)原地址https://blog.csdn.net/noaman_wgs/article/details/70214612/ Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统 ...
- bootStrap的轮播
1.1如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- C语言实例解析精粹学习笔记——30
实例30: 用已知字符串s中的字符,生成由其中n个字符组成的所有字符排列.设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次.例如,对于s[]="abc",n=2, ...
- go学习笔记-流程控制(if/else,for/range)
流程控制(if/else,for/range) if if条件判断语句的语法概括起来就是:如果满足条件就做某事,否则做另一件事. func testIf() { num := 10 if num &l ...