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:
- Las funciones agregadas min() y max() devuelven valores que no aceptan valores NULL
- Coincidencia de expresiones regulares en la posición de índice especificada
- Soporte ampliado para idiomas anteriores y versiones de API
- Acceder a anotaciones mediante reflexión
- Versión estable de función recursiva profunda
- La marca de tiempo de la fuente de tiempo predeterminada se basa en una clase en línea
- Nuevas funciones de extensión experimentales para Java Opcional
- Admite captura con nombre en plataformas JS y nativas