作者:Antonio Leiva

时间: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)的更多相关文章

  1. 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码

    来自:http://www.cnblogs.com/lcxu2/archive/2011/01/16/2004016.html 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或 ...

  2. python之类的多态(鸭子类型 )、封装和内置函数property

    一.多态 1.什么是多态:一个类表现出的多种状态--->通过继承来实现的例如:class Animal:passclass Dog(Animal):passclass Cat(Animal):p ...

  3. Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)

    本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...

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

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

  5. 《疯狂Kotlin讲义》读书笔记6——函数和Lambda表达式

    函数和Lambda表达式 Kotlin融合了面向过程语言和面向对象语言的特征,相比于Java,它增加了对函数式编程的支持,支持定义函数.调用函数.相比于C语言,Kotlin支持局部函数(Lambda表 ...

  6. T-SQL编程 —— 用户自定义函数(内嵌表值函数)

    内嵌表值函数 接上 <T-SQL编程 -- 用户自定义函数(标量函数)> http://www.cnblogs.com/viusuangio/p/6212072.html 内嵌表值函数可以 ...

  7. python 类型判断-- isinstance函数

    判断类型 函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str.list.dict,也可以用在我们自定义的类,它们本质上都是数据类型. 假设有如下的 Per ...

  8. Python入门之函数的介绍/定义/定义类型/函数调用/Return

    本篇目录: 一. 函数的介绍 二. 函数的定义 三. 定义函数的三种类型 四. 函数调用的阶段 五. Return返回值 ======================================= ...

  9. Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数

    Python第七天   函数  函数参数   函数里的变量   函数返回值  多类型传值     函数递归调用   匿名函数   内置函数 目录 Pycharm使用技巧(转载) Python第一天   ...

随机推荐

  1. 【luogu P1972 [SDOI2009]HH的项链】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1972 真是不懂为什么要卡莫队! #include <cmath> #include <cs ...

  2. C#多线程最简单Demo

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. EF6 AddOrUpdate之后,数据没有改变而是新增了一条数据解决办法

    EF:修改不是查询出来的对象dbContext.Web_User.AddOrUpdate(user);dbContext.SaveChanges(); 上面的写法有时候可能不起作用,而且把这条数据重复 ...

  4. phpstorm常用plugins

    CodeGlance JsonOnlineViewer CSS-X-Fire Laravel Plugin PHP annotations

  5. 数据流管理:redux

    redux和react是两个独立的库,所以redux并不是非用不可,是在Flux框架的基础上改进的一个框架,所以一鸣惊人 redux的三大基本原则 唯一的数据源(single source of tr ...

  6. 重写equals方法(未完)

    equals方法是我们日常编程中很常见的方法,Object中对这个方法的解释如下: boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”. 查看该方法的底层代码如 ...

  7. sqlServer2014安装说明(windows7 64位)

    SqlServer2014安装说明(windows7 64位) 地址:https://www.microsoft.com/zh-cn/download/details.aspx?id=42299 1, ...

  8. 编写可维护的JavaScript---事件处理

    在JavaScript应用中事件处理是非常重要的,所有的JavaScript都是通过事件绑定到UI上的. 1. 典型用法 当事件触发的时候,事件对象event会最为回调参数传入到事件处理程序中.eve ...

  9. LeetCode 简单 - 最大子序和(53)

    采用动态规划方法O(n) 设sum[i]为以第i个元素结尾且和最大的连续子数组.假设对于元素i,所有以它前面的元素结尾的子数组的长度都已经求得,那么以第i个元素结尾且和最大的连续子数组实际上,要么是以 ...

  10. [ZJOI2006]超级麻将(动规)

    题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...