Novedades de Kotlin 1.7.0

1. El valor en línea de una clase en línea se puede implementar mediante delegación

Si desea crear un contenedor liviano para una instancia de valor o clase, debe implementar todos los métodos de interfaz manualmente. La implementación a través de delegados resuelve este problema, pero antes de 1.7.0 no funcionaba en clases en línea. Esta limitación se eliminó, por lo que ahora puede crear contenedores livianos que no requieren asignación de memoria en la mayoría de los casos.

interface Bar {
    fun foo() = "foo"
}

@JvmInline
value class BarWrapper(val bar: Bar): Bar by bar

fun main() {
    val bw = BarWrapper(object: Bar {})
    println(bw.foo())
}

2. El operador de guión bajo se utiliza para parámetros de tipo.

Kotlin 1.7.0 introduce el operador de guión bajo _ para parámetros de tipo. Esto se puede utilizar para inferir automáticamente parámetros de tipo cuando se especifican otros tipos:

abstract class SomeClass<T> {
    abstract fun execute(): T
}

class SomeImplementation : SomeClass<String>() {
    override fun execute(): String = "Test"
}

class OtherImplementation : SomeClass<Int>() {
    override fun execute(): Int = 42
}

object Runner {
    inline fun <reified S: SomeClass<T>, T> run(): T {
        return S::class.java.getDeclaredConstructor().newInstance().execute()
    }
}

fun main() {
    // T is inferred as String because SomeImplementation derives from SomeClass<String>
    val s = Runner.run<SomeImplementation, _>()
    assert(s == "Test")

    // T is inferred as Int because OtherImplementation derives from SomeClass<Int>
    val n = Runner.run<OtherImplementation, _>()
    assert(n == 42)
}

Los parámetros de tipo se pueden inferir utilizando el operador de subrayado en cualquier lugar de una lista de variables.

3. Inferencia del generador de versiones estables

La inferencia del constructor es un tipo especial de inferencia de tipos que resulta útil al llamar a funciones genéricas del constructor. Ayuda al compilador a inferir los parámetros de tipo de una llamada utilizando información de tipo de otras llamadas dentro de los parámetros lambda.

A partir de 1.7.0, la inferencia del constructor se activa automáticamente si la inferencia de tipos normal no puede obtener suficiente información sobre el tipo sin especificar la opción del compilador -Xenable-builder-inference (introducida en 1.6.0).

Aprenda a escribir constructores genéricos personalizados .

4. Requisitos de suscripción a la versión estable

A partir de la versión 1.7.0, los requisitos de participación de Kotlin se han estabilizado y no se requiere ninguna configuración adicional del compilador.

Antes de la versión 1.7.0, la función de participación requería el parámetro -opt-in=kotlin.RequiresOptIn para evitar advertencias. Esto ya no es necesario; sin embargo, aún puede usar el parámetro del compilador -opt-in para seleccionar otras anotaciones para su inclusión, dirigidas a todo el módulo.

5. La versión estable no debe ser de tipo vacío.

En Kotlin 1.7.0, los tipos explícitos no nulos se han promovido a una característica de estabilidad. Proporcionan una mejor interoperabilidad al ampliar clases e interfaces genéricas de Java.

Puede utilizar la nueva sintaxis T & Any para marcar los parámetros de tipo como explícitamente no nulos cuando los utilice. Esta forma sintáctica proviene de la notación para tipos de intersección, ahora restringida a tener un parámetro de tipo con un límite superior que acepta valores NULL en el lado izquierdo de & y un Any no nulo en el lado derecho:

fun <T> elvisLike(x: T, y: T & Any): T & Any = x ?: y

fun main() {
    // OK
    elvisLike<String>("", "").length
    // Error: 'null' cannot be a value of a non-null type
    elvisLike<String>("", null).length

    // OK
    elvisLike<String?>(null, "").length
    // Error: 'null' cannot be a value of a non-null type
    elvisLike<String?>(null, null).length
}

6. Biblioteca estándar

En Kotlin 1.7.0, la biblioteca estándar recibió una serie de cambios y mejoras. Introducen nuevas funciones, estabilizan funciones experimentales y unifican el soporte para grupos de captura con nombre en Native, JS y JVM:

Supongo que te gusta

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