作者:Antonio Leiva

时间:Mar 2, 2017

原文链接:https://antonioleiva.com/reified-types-kotlin/

对于Java开发者来说,最懊恼的限制之一是,在用泛型时不能够直接地使用类型。

通常解决方法是以函数参数形式传递类,这使得代码更复杂且缺乏吸引力。

在Kotlin中,多亏有了inline函数(我们已经讨论过),我们可以用reified类型使我们能够在函数内使用它们。

为什么会如此?你会明白的,你会喜欢它的。

Reified 类型

如我早前的论述,以reified修饰类型后,我们就能够在函数内部使用相关类型了

重要的是,使用内联函数后,在其运行地方需要替换代码来获得类型。事实上由于Java虚拟机的限制,类型不能使用,而是跳过限制的“诡计”。

引导到一个活动(Activity)

这是最典型的Android应用案例。

在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书。

转载于:https://www.cnblogs.com/figozhg/p/6501415.html

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

  1. python返回变量类型_Python指定函数参数、返回值类型报错是咋了?

    Leetcode刷题给的默认函数格式是这样的: Class Solution: def coinChange(self, coins: List[int], amount: int) -> in ...

  2. python 定义函数参数的类型_1作为函数声明中的参数类型 - python

    如果在我的示例中需要在Python数组中指定参数类型,则需要编写如下内容: def my_function(param: list): pass 在Swift中,您可以这样指定参数类型: func m ...

  3. 【Kotlin】字符串操作 ① ( 截取字符串函数 substring | 拆分字符串函数 split | 解构语法特性 )

    文章目录 一.截取字符串函数 substring 二.拆分字符串函数 split 一.截取字符串函数 substring Kotlin 中提供了 截取字符串函数 substring , 可接收 Int ...

  4. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  5. Kotlin学习笔记(二)——函数操作符内置函数

    小白笔记(持续更新中) 匿名函数 //匿名函数 fun main() {//count()方法 Returns the length of this char sequence.val len=&qu ...

  6. 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )

    文章目录 I . 函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 ...

  7. JavaScript 函数定义+内置函数使用+array对象+object类型

    文章目录 函数定义 random() setInterval() setTimeout() 数组对象 object 函数定义 两种格式: function 自定义函数名称(参数1,参数2,...,参数 ...

  8. golang函数——可以为类型(包括内置数据类型)定义函数,类似类方法,同时支持多返回值...

    不可或缺的函数,在Go中定义函数的方式如下: func (p myType ) funcName ( a, b int , c string ) ( r , s int ) {return } 通过函 ...

  9. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

最新文章

  1. RDKit | 基于随机森林(RF)预测SARS-CoV 3CL蛋白酶抑制剂的pIC50
  2. 【 FPGA 】组合逻辑中的竞争与险象问题(二)
  3. 大数据和高并发的解决方案汇总
  4. 博途v15做上位画面_1399元起!realme真我V15评测:当科技遇上国潮 越级还能这么玩...
  5. Sentinel一键下载安装运行_分布式系统集群限流_线程数隔离_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0030
  6. Create-React-App创建antd-mobile开发环境
  7. dw2019连接mysql数据库_Python3连接MySQL数据库
  8. 随笔之生成简单的验证码
  9. wincap的使用总结
  10. outlook邮箱邮件与企业邮箱同步(outlook本地文件夹邮件,web邮箱里没有)
  11. 有哪些好用的智能写作工具?
  12. 读取文件并输出,输出时将小写字母转为大写
  13. 图神经网络的图网络学习(上)
  14. 中国56个民族JSON数据
  15. NLP实践|CCKS2020金融知识图谱自动化构建技术方法总结
  16. UA OPTI501 电磁波 求解麦克斯韦方程组的Fourier方法2 麦克斯韦方程组的解
  17. 阿里宣布组织大变动:集团迎来首位 80 后 CTO、张勇亲自挂帅阿里云!
  18. 大数据时代鸿星尔克因系统崩溃恳请顾客退款;微信里可以开借条了;阿里云盘来势汹汹却首战告败?
  19. C#的兰姆达表达式与委托配合使用时的一些问题
  20. Thinkpad R61I 驱动下载及安装方法 for windows 2003

热门文章

  1. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法
  2. Web页面布局方式小结
  3. Java,开源,分享
  4. ACS AD 和本地验证SSL ×××
  5. sql server 按时间段查询
  6. OpenCV分配与释放图像空间
  7. 在线实时大数据平台Storm开发之wordcount
  8. htmlparser操作bean类提取html页面元素
  9. (转载)Using GCC’s C++ Compiler
  10. i2c的时钟延展问题