Novedades de Kotlin 1.6.0

1. La versión estable se agota cuando se declaran enumeraciones, clases selladas y sujetos booleanos.

Una whendeclaración exhaustiva contiene ramas para todos los tipos o valores posibles del tema, o una elserama para algunos tipos. Cubre todos los escenarios posibles y hace que el código sea más seguro.

Las declaraciones no exhaustivas whenestán a punto de ser suprimidas para que el comportamiento sea whencoherente con las expresiones. Para garantizar una migración sin problemas, Kotlin 1.6.0 emite whenadvertencias para declaraciones no exhaustivas sobre temas de enumeración, clases selladas o tipos booleanos. Estas advertencias se convertirán en errores en una versión futura.

2. La versión estable suspende la función como un supertipo.

En Kotlin 1.6.0, la implementación de tipos de funciones de suspensión se ha estabilizado. Hay una versión preliminar disponible para 1.5.30.

Esta característica es útil al diseñar API que utilizan corrutinas de Kotlin y aceptan tipos de funciones suspendidas. Ahora puede simplificar su código encapsulando el comportamiento deseado en una clase separada que implemente el tipo de función de suspensión.

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

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

Mientras que anteriormente solo se permitían referencias lambdas y funciones suspendidas, ahora se permiten instancias de esta clase: launchOnClick(MyClickAction()).

Actualmente existen dos limitaciones debido a los detalles de implementación:

  1. No puede mezclar tipos de funciones normales y tipos de funciones suspendidas en la lista de supertipos.
  2. No se pueden utilizar varios supertipos de funciones de pausa.

3. La versión estable bloquea la conversión

Kotlin 1.6.0 introduce una conversión estable de tipos de funciones normales a tipos de funciones suspendidas. A partir de 1.4.0, esta característica admite literales de funciones y referencias invocables. A partir de 1.6.0, se puede utilizar con cualquier forma de expresión. Como parámetro de llamada, ahora es posible pasar cualquier expresión adecuada para un tipo de función normal, donde se espera un tipo de función pendiente. El compilador realizará automáticamente conversiones implícitas.

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

fun suspending() {}

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

4. Creación de instancias de clase de anotación de versión estable

Kotlin 1.5.30 introduce soporte experimental para crear instancias de clases de anotación en la plataforma JVM. En 1.6.0, esta característica está disponible de forma predeterminada para Kotlin/JVM y Kotlin/JS.

5. Inferencia de tipos mejorada para tipos genéricos recursivos

Kotlin 1.5.30 introduce mejoras en la inferencia de tipos para tipos genéricos recursivos, lo que permite inferir parámetros de tipo basándose únicamente en el límite superior del parámetro de tipo correspondiente. Esta mejora sólo está disponible en las opciones del compilador. En la versión 1.6.0 y superiores, esta función está habilitada de forma predeterminada

// 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. Cambios en la inferencia del tipo de constructor.

La inferencia del constructor es un método de inferencia de tipos que es muy útil al llamar a funciones genéricas del constructor. Puede inferir los parámetros de tipo de la llamada a partir de la información de tipo dentro del parámetro lambda de la llamada.

Se realizaron múltiples cambios para acercarse a una inferencia del constructor completamente estable. A partir de 1.6.0:

Las funciones que devuelven instancias de tipos aún por inferir se pueden llamar en lambdas del constructor sin especificar la opción del compilador -Xunrestricted-builder-inference introducida en 1.5.30. Al utilizar -Xenable-builder-inference, puede escribir su propio constructor sin aplicar la anotación @BuilderInference.

Tenga en cuenta que los clientes de estos constructores deberán especificar la misma opción del compilador -Xenable-builder-inference.

Con -Xenable-builder-inference, la inferencia del constructor se activa automáticamente si la inferencia de tipo normal no puede obtener suficiente información sobre el tipo.

7. Soporte para anotaciones en parámetros de tipo de clase.

@Target(AnnotationTarget.TYPE_PARAMETER)
annotation class BoxContent

class Box<@BoxContent T> {}

Las anotaciones sobre todos los parámetros de tipo se compilan en código de bytes JVM para que puedan ser utilizadas por el procesador de anotaciones.

8. Biblioteca estándar

Supongo que te gusta

Origin blog.csdn.net/old_land/article/details/130206184
Recomendado
Clasificación