Kotlin 1.6.0 的新特性

1、稳定版对于枚举、密封类与布尔值主语穷尽 when 语句

一个详尽的when语句包含了所有主题可能的类型或值的分支,或者对于一些类型包含一个else分支。它覆盖了所有可能的情况,使代码更加安全。

即将禁止非详尽的when语句,以使行为与when表达式一致。为了确保平滑的迁移,Kotlin 1.6.0 会对枚举、密封类或布尔类型的主题的非详尽的when语句发出警告。这些警告将在未来的版本中变成错误。

2、稳定版挂起函数作为超类型

在Kotlin 1.6.0中,挂起函数类型的实现已经变得稳定。1.5.30提供了预览版。

在设计使用Kotlin协程并接受挂起函数类型的api时,该特性非常有用。现在,可以通过将所需的行为封装在实现挂起函数类型的单独类中来简化代码。

class MyClickAction : suspend () -> Unit {
    override suspend fun invoke() { TODO() }
}

fun launchOnClick(action: suspend () -> Unit) {}

在先前只允许使用lambda和挂起函数引用的地方,现在可以使用此类的实例:launchOnClick(MyClickAction())

目前由于实现细节,存在两个限制:

  1. 您不能在超类型列表中混合普通函数类型和暂停函数类型。
  2. 您不能使用多个暂停函数超类型。

3、稳定版挂起转换

Kotlin 1.6.0引入了从普通函数类型到挂起函数类型的稳定转换。从1.4.0开始,该功能支持函数字面值和可调用引用。在1.6.0中,它可以与任何形式的表达式一起使用。作为调用参数,现在可以传递任何适合普通函数类型的表达式,其中预期是挂起函数类型。编译器将自动执行隐式转换。

fun getSuspending(suspending: suspend () -> Unit) {}

fun suspending() {}

fun test(regular: () -> Unit) {
    getSuspending { }           // OK
    getSuspending(::suspending) // OK
    getSuspending(regular)      // OK
}

4、稳定版注解类实例化

Kotlin 1.5.30引入了在JVM平台上实例化注解类的实验性支持。在1.6.0中,该功能默认可用于Kotlin/JVM和Kotlin/JS。

5、改进了递归泛型类型的类型推断

Kotlin 1.5.30引入了对递归泛型类型的类型推断的改进,使其仅基于对应类型参数的上界即可推断类型参数。该改进只能在编译器选项下使用。在版本1.6.0及更高版本中,默认启用了此功能

// Before 1.5.30
val containerA = PostgreSQLContainer<Nothing>(DockerImageName.parse("postgres:13-alpine")).apply {
  withDatabaseName("db")
  withUsername("user")
  withPassword("password")
  withInitScript("sql/schema.sql")
}

// With compiler option in 1.5.30 or by default starting with 1.6.0
val containerB = PostgreSQLContainer(DockerImageName.parse("postgres:13-alpine"))
  .withDatabaseName("db")
  .withUsername("user")
  .withPassword("password")
  .withInitScript("sql/schema.sql")

6、构建器类型推断变更

Builder inference是一种类型推断方式,用于调用泛型构建器函数时非常有用。它可以通过lambda参数内部调用的类型信息来推断调用的类型参数。

进行多个更改,以更接近完全稳定的builder推断。从1.6.0开始:

可以在builder lambda中调用返回尚未推断类型实例的函数,而无需指定1.5.30中引入的-Xunrestricted-builder-inference编译器选项。 通过使用-Xenable-builder-inference,可以编写自己的构建器而无需应用@BuilderInference注解。

请注意,这些构建器的客户端将需要指定相同的-Xenable-builder-inference编译器选项。

使用-Xenable-builder-inference,如果常规类型推断无法获取关于类型的足够信息,则builder推断将自动激活。

7、对类的类型参数上注解的支持

@Target(AnnotationTarget.TYPE_PARAMETER)
annotation class BoxContent

class Box<@BoxContent T> {}

所有类型参数上的注解都会被编译为 JVM 字节码,这样注解处理器就可以使用它们。

8、标准库

猜你喜欢

转载自blog.csdn.net/old_land/article/details/130206184