资讯专栏INFORMATION COLUMN

Kotlin 1.6.0 正式发布

番茄西红柿 / 2979人阅读

摘要:月日正式发布了,这个版本根据一些反馈,将上一版本中的一些实验的语法特性进行了转正。当你需要调用这些时,需要传入一个函数类型的实例。中将此默认打开。此外还加入了其他一些新的语法特性,详情可以参考

11月16日 JetBrains 正式发布了 Kotlin 1.6.0,这个版本根据一些反馈,将上一版本中的一些实验的语法特性进行了转正。例如

  • Sealed exhaustive whens
  • Suspending functions as supertypes
  • ...

Sealed exhaustive whens

当我们在 when 中使用诸如枚举、密封类/接口等可穷举类型时,某些情况下可能写出不安全的代码

sealed class Contact {   data class PhoneCall(val number: String) : Contact()   data class TextMessage(val number: String) : Contact()   data class InstantMessage(val type: IMType, val user: String) : Contact()}复制代码

如上,定义了三个子类的密封类

fun Rates.computeMessageCost(contact: Contact): Cost =   when (contact) { // ERROR: when expression must be exhaustive       is Contact.PhoneCall -> phoneCallCost       is Contact.TextMessage -> textMessageCost   }复制代码

此时如果 case 后跟的是一个表达式, 则如果 case 分支没有穷举所有子类,编译器会报错

但是如果如果 case 后个的是一个语句,如下

fun sendAnnouncement(contact: Contact, announcement: Announcement) {   when (contact) {       is Contact.PhoneCall -> schedulePhoneCall(contact.number, announcement)       is Contact.TextMessage -> sendTextMessage(contact.number, announcement)   }}复制代码

此时即使没有穷举所有子类,编译器也不会报错,这可能会造成不必要的bug

Kotlin 1.6 在这种情况下,编译器会给出 Warning ,按计划 1.7 之后 Warning 会改为 Error,强制开发者补齐所有分支逻辑,避免出现 Bug

Suspending functions as supertypes

Kotlin 中许多 API 都以函数类型作为参数。当你需要调用这些 API 时,需要传入一个函数类型的实例。而当你想在实例中封装一些可复用的逻辑时,可以使用函数类型作为父类创建子类。

但是这种做法目前不适用于挂起函数,你无法继承一个 suspend 函数类型的父类

class C : suspend () -> Unit { // Error: Suspend function type is not allowed as supertypes }C().startCoroutine(completion = object : Continuation<Unit> {    override val context: CoroutineContext        get() = TODO("Not yet implemented")    override fun resumeWith(result: Result<Unit>) {        TODO("Not yet implemented")    }})复制代码

Kotlin 1.5.30 在 Preveiw 中引入了此特性,可以继承一个 suspend 的函数类型

class MyClickAction : suspend () -> Unit {    override suspend fun invoke() { TODO() }}fun launchOnClick(action: suspend () -> Unit) {}复制代码

如上,你现在可以这样调用 launchOnClick(MyClickAction())

1.6 中将此 feature 默认打开。

此外 1.6 还加入了其他一些新的语法特性,详情可以参考:blog.jetbrains.com/kotlin/2021…

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123972.html

相关文章

  • 弃 Java 而使用 Kotlin 的你后悔了吗?| kotlin将会是最好的开发语言

    摘要:本报告受访者的工作经验比参加调查的开发者要少一些。这其中不乏有因品牌吸引而投身于开发的学生,据调查显示,早期,主要由经验丰富的专业开发者使用,如今大批年轻的开发者及学生开始涌入。 自从 2011 年发布以来,Kotlin 凭借强大的功能在开发者中的欢迎程度与日俱增。且在一年前,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了从 Java 迁移到 Ko...

    ad6623 评论0 收藏0
  • 前端每周清单第 38 期: Node 9 发布Kotlin 与 React,Netflix 架构解

    摘要:发布本周正式发布,包含了一系列的特性提升与问题修复,同时也在不断致力于将打造地更为轻巧与高性能。当然,姜振勇老师还会介绍的多种服务,包括大数据网络和安全,展现弹性安全和高可扩展性的全方位能力。 showImg(http://upload-images.jianshu.io/upload_images/1647496-2ce7598e6987d9af.jpg?imageMogr2/aut...

    Carbs 评论0 收藏0
  • Kotlin 新版来了,支持跨平台!

    摘要:还有一个好消息正式发布,做了对的支持。支持的目标平台有位。该版本也增加了对工程的实验性质的支持。于此同时微软也在大力发展自己的语言的跨平台,并且也在支持开发语言的各种工具,其实是在对和提出了挑战。点击上方开发者技术前线,选择星标 来源:开发者技术前线 作者:Tamic | 编辑: 可可 谷歌在今年的 I/O 大会上宣布,Kotlin 编程语言现在是 Android 应用程序开发人员的首选...

    szysky 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<