Kotlin Vocabulary | 类型别名 typealias

2020 年 4 月 18 日 谷歌开发者


作者 / David Winer, Kotlin 产品经理


有时候一些可读性差、不够明确或者名字太长的类型声明会干扰代码的 "自我表达"。这种情况下,可以使用 Kotlin 特别针对这个问题提供的特性: Typealias (本文下称 "类型别名")。类型别名可以使您在不增加新类型的情况下,为现有类或函数类型提供替代名称。



类型别名的使用


使用类型别名为函数类型命名:

typealias TeardownLogic = () -> Unitfun onCancel(teardown : TeardownLogic){ }private typealias OnDoggoClick = (dog: Pet.GoodDoggo) -> Unitval onClick: OnDoggoClick

不过要注意这种用法会隐藏传入参数,使可读性变差:
typealias TeardownLogic = () -> Unittypealias TeardownLogic = (exception: Exception) -> Unitfun onCancel(teardown : TeardownLogic){      // 无法轻易知晓可以从 TeardownLogic 得到什么信息}

类型别名有助于缩短较长的泛型类名:
typealias Doggos = List<Pet.GoodDoggo>fun train(dogs: Doggos){ ... }

使用类型别名时,需要思考是否有必要这么做: 在这里使用类型别名真的会让您的代码意义更明确、可读性更好吗?

思考一下,使用类型别名是否使您的代码变得更易懂

如果您正使用的某个类名称很长,您可以使用类型别名来缩短它:

typealias AVD = AnimatedVectorDrawable

在此示例中,使用 导入别名 (import alias)  会更加合适:
import android.graphics.drawable.AnimatedVectorDrawable as AVD


  • 导入别名 (import alias)

    https://kotlinlang.org/docs/reference/packages.html#imports


更适用的场景是: 如果在代码中出现了来自不同包的相同类名,可以使用导入别名来消除这样的歧义:
import io.plaidapp.R as appRimport io.plaidapp.about.R

由于类型别名需要在类的外部声明,所以使用时您需要考虑约束它们的可见性。



在多平台工程中使用类型别名


在使用 Kotlin 开发多平台工程时,您可以在公共代码 (common code) 中写一个接口,并在相应的平台代码中实现这个接口。Kotlin 提供了 "实际声明" (actual declarations) 和  "预期声明" (expected declarations) 的机制来简化这种操作。在公共代码中声明的接口为预期声明,使用 expect 关键字;在相应的平台代码中的扩展为实际声明,使用 actual 关键字。如果平台代码中已经实现了公共代码中的某个接口,并且所有期望方法的签名一致时,您可以使用类型别名将实际声明的类型名称映射到期望类型上:

expect annotation class Testactual typealias Test = org.junit.Test


  • 多平台工程

    https://kotlinlang.org/docs/reference/platform-specific-declarations.html



工作原理


类型别名不会引入新的类型。例如,反编译 train 和 play 方法后,可以看到传入参数仅使用了 List 类型:
// Kotlintypealias Doggos = List<Pet.GoodDoggo> fun train(dogs: Doggos) { ... }fun play(dogs: Doggos) { ... }// 反编译后 Java 代码public static final void train(@NotNull List dogs) { … }   public static final void play(@NotNull List dogs) { … }

类型别名不会引入新的类型

因此,您不应该依赖类型别名做编译类型检查,而应该使用一个不同的类型或者内联类。例如,下面的方法中,需要传入一个长整型参数:
fun play(dogId: Long)

为长整型取一个别名,并不能防止您传入一个错的 id:
typealias DogId = Longfun pet(dogId: DogId) { … }fun usage() {    val cat = Cat(1L)    pet(cat.catId) // compiles}

类型别名为现有类型提供一个更短或更具意义的名称。但如果您要追求更高的安全性,则创建一个新的类型会比较合适。



推荐阅读






 点击屏末  | 了解更多关于用 Kotlin 进行 Android 开发的相关资料



登录查看更多
0

相关内容

专知会员服务
168+阅读 · 2020年6月4日
Python地理数据处理,362页pdf,Geoprocessing with Python
专知会员服务
111+阅读 · 2020年5月24日
《强化学习》简介小册,24页pdf
专知会员服务
265+阅读 · 2020年4月19日
【ACL2020-Allen AI】预训练语言模型中的无监督域聚类
专知会员服务
23+阅读 · 2020年4月7日
机器学习速查手册,135页pdf
专知会员服务
337+阅读 · 2020年3月15日
MIT新书《强化学习与最优控制》
专知会员服务
272+阅读 · 2019年10月9日
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
18+阅读 · 2019年10月28日
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
教你在Python中实现潜在语义分析(附代码)
数据派THU
8+阅读 · 2018年12月6日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
Neural Image Captioning
Arxiv
5+阅读 · 2019年7月2日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
3+阅读 · 2018年12月18日
Arxiv
5+阅读 · 2018年1月30日
Arxiv
5+阅读 · 2017年12月29日
Arxiv
3+阅读 · 2017年12月18日
Arxiv
5+阅读 · 2017年11月30日
Arxiv
5+阅读 · 2017年7月23日
VIP会员
相关VIP内容
相关资讯
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
18+阅读 · 2019年10月28日
Python 3.8.0来了!
数据派THU
5+阅读 · 2019年10月22日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
教你在Python中实现潜在语义分析(附代码)
数据派THU
8+阅读 · 2018年12月6日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
快乐的迁移到 Python3
Python程序员
5+阅读 · 2018年3月25日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
相关论文
Neural Image Captioning
Arxiv
5+阅读 · 2019年7月2日
Arxiv
3+阅读 · 2019年3月1日
Arxiv
3+阅读 · 2018年12月18日
Arxiv
5+阅读 · 2018年1月30日
Arxiv
5+阅读 · 2017年12月29日
Arxiv
3+阅读 · 2017年12月18日
Arxiv
5+阅读 · 2017年11月30日
Arxiv
5+阅读 · 2017年7月23日
Top
微信扫码咨询专知VIP会员