Kotlin 1.6.0 正式发布

简介: Kotlin 1.6.0 正式发布

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…

目录
相关文章
|
18天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
25天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
29 2
|
2月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
|
7月前
|
安全 Java 编译器
Kotlin 1.6 正式发布,带来哪些新特性?
Kotlin 1.6 正式发布,带来哪些新特性?
54 0
|
IDE Java 开发工具
Kotlin 1.8.0 现已发布,有那些新特性?
Kotlin 1.8.0 现已发布,有那些新特性?
205 0
Kotlin 1.8.0 现已发布,有那些新特性?
|
安全 Java Android开发
kotlin学习和常用知识
@[TOC](目录) Kotlin 是一种由 JetBrains 公司开发的静态类型编程语言,旨在为 Java 开发者提供一种更加安全、简洁、易于使用的编程语言。Kotlin 可以编译成 Java 字节码,因此可以在 Java 虚拟机(JVM)上运行。下面是关于 Kotlin 的详细解释、发展历史、语法学习和代码解读。 # 一、Kotlin 详解 1. 基本概念 Kotlin 是一种静态类型语言,这意味着在编译时会对代码进行类型检查,从而减少了在运行时的错误。Kotlin 也支持面向对象编程,具有封装、继承、多态等特性。此外,Kotlin 还支持函数式编程,具有高阶函数、Lambda 表达式、
182 0
|
Java Kotlin
学习Kotlin一
学习Kotlin一
98 0
学习Kotlin一
|
Java 编译器 Kotlin
Kotlin之DataClass学习
Kotlin之DataClass学习
203 0
|
Java Android开发 Kotlin
【Kotlin】Kotlin 中使用 ButterKnife ( 仅用于适配 Kotlin 语言 | 不推荐新项目使用 )
【Kotlin】Kotlin 中使用 ButterKnife ( 仅用于适配 Kotlin 语言 | 不推荐新项目使用 )
526 0
|
Java Android开发
来入门一下kotlin吧
Kotlin是什么? Kotlin是一种在java虚拟机上运行的静态类型的编程语言,被称之为 Android 世界的Swift,由 JetBrains 设计开发并开源。
1542 0