Kotlin 2.4.0 ya está aquí. JetBrains lo publicó el 11 de agosto de 2026, y aunque no trae ningún cambio de los que obligan a reescribir proyectos, sí que consolida varias piezas que llevaban tiempo en fase experimental. Los context parameters y los explicit backing fields pasan a estable, la API de UUID por fin se da por cerrada, y el compilador ya genera bytecode compatible con Java 26.
Vamos por partes, porque hay bastante contenido para desarrolladores que trabajan en JVM, Kotlin/Native o Kotlin/Wasm.
Context parameters: estable de una vez
Esta es probablemente la novedad con más recorrido. Los context parameters permiten pasar dependencias de forma implícita a una función, sin ensuciar la firma con parámetros que en realidad son infraestructura:
class EmailSender
class SmsSender
context(emailSender: EmailSender)
fun sendNotification() {
println("Sent email notification")
}
context(smsSender: SmsSender)
fun sendNotification() {
println("Sent SMS notification")
}
Junto a esto llega, en modo experimental, la posibilidad de pasar argumentos de contexto de forma explícita cuando hay ambigüedad entre varias sobrecargas:
context(defaultEmailSender: EmailSender, defaultSmsSender: SmsSender)
fun notifyUser() {
sendNotification(emailSender = defaultEmailSender)
sendNotification(smsSender = defaultSmsSender)
}
Explicit backing fields, ya estables
Otra pieza que llevaba un tiempo cocinándose: ahora se puede acceder de forma explícita al backing field de una propiedad con la palabra clave field, sin recurrir al truco de siempre de declarar una propiedad privada y otra pública encima:
var name: String
field = value
get() = field.uppercase()
Novedades experimentales en el lenguaje
Kotlin 2.4.0 también estrena, en modo experimental, sintaxis de collection literals para crear listas sin llamar a listOf() o mutableListOf():
val shapes: MutableList<String> = ["triangle", "square", "circle"] val fruit = ["apple", "banana", "cherry"]
Y se amplía el soporte de constantes evaluadas en tiempo de compilación, ahora con operaciones sobre tipos sin signo y funciones de string:
const val MAX_UNSIGNED = UInt.MAX_VALUE.toString() const val LOWERCASE = "HELLO".lowercase()
La librería estándar también se mueve
La API de UUID llega a estable, sin florituras: Uuid.random() y Uuid.parse() ya se pueden usar en producción sin el aviso de API experimental. Se añaden también funciones para comprobar si una colección está ordenada:
val numbers = listOf(1, 2, 3, 4)
println(numbers.isSorted())
data class User(val name: String, val age: Int)
val users = listOf(User("Alice", 24), User("Bob", 31))
println(users.isSortedBy(User::age))
Y hay una distinción fina, pero útil, entre dos formas de rellenar un mapa: una que sustituye un valor null existente y otra que respeta la clave aunque su valor sea null:
val map = mutableMapOf<String, String?>("user" to null)
map.getOrPutIfNull("user") { "default_user" }
map.getOrPutIfMissing("user") { "default_user" }
Kotlin/JVM: soporte para Java 26
El compilador ya genera bytecode compatible con Java 26, y las anotaciones se escriben ahora en los metadatos de Kotlin junto al bytecode por defecto, así los annotation processors pueden acceder a ellas sin recurrir a reflexión.
Kotlin/Native: GC concurrente por defecto y Swift más cerca
El recolector de basura de marca concurrente (CMS GC) pasa a ser el que se usa por defecto en Kotlin/Native, con el objetivo de mejorar pausas y capacidad de respuesta. Quien lo necesite puede volver al anterior con kotlin.native.binary.gc=pmcs.
Para quien combina Kotlin y Swift en el mismo proyecto, hay dos novedades relevantes. Primero, ya se pueden declarar paquetes Swift como dependencias directamente desde Gradle:
kotlin {
swiftPMDependencies {
swiftPackage(
url = url("https://github.com/firebase/firebase-ios-sdk.git"),
version = from("12.11.0"),
products = listOf(product("FirebaseAI"), product("FirebaseAnalytics"))
)
}
}
Segundo, Swift export sigue en alpha pero avanza: ya soporta concurrencia estructurada (una función suspend de Kotlin se puede llamar con await desde Swift) y exportación de Flow como AsyncSequence. El compilador LLVM que usa Kotlin/Native pasa a la versión 21, y suben las versiones mínimas de Apple soportadas: iOS/tvOS a 15.0, macOS a 12.0 y watchOS a 8.0.
Kotlin/Wasm: compilación incremental por defecto
La compilación incremental para Kotlin/Wasm pasa a estar habilitada por defecto, lo que debería notarse en los tiempos de build de proyectos grandes. Además entra en fase experimental el soporte para el WebAssembly Component Model, pensado para construir componentes reutilizables y aplicaciones tipo FaaS/serverless.
Kotlin/JS: exportar value classes a TypeScript
Ahora se pueden exportar inline value classes a TypeScript, algo que hasta ahora quedaba fuera del alcance de @JsExport:
@JsExport
@JvmInline
value class Email(val address: String) {
init {
require(address.contains("@")) { "Invalid email" }
}
}
También se preserva la varianza de los tipos genéricos al generar los .d.ts, y el inlining de JS ya soporta características de ES2015 como el spread operator dentro de bloques js("...").
Cambios de compatibilidad a tener en cuenta
El compilador K1 deja de estar soportado (la opción -language-version=1.9 desaparece), y se elimina el plugin Maven KotlinScriptMojo para ejecución de scripts. Nada dramático si el proyecto ya usa K2, pero conviene revisarlo antes de actualizar en un pipeline de CI.
Para quien gestiona proyectos con Gradle, Kotlin 2.4.0 es compatible con las versiones 7.6.3 a 9.5.0, con AGP mínimo 8.5.2. Y en Maven, ahora se puede alinear automáticamente la versión de Java/JVM con la propiedad maven.compiler.release sin duplicar configuración.
En conjunto, es una actualización de las que no dan titulares, pero que quita bastante código de compatibilidad manual del día a día: menos boilerplate para pasar dependencias implícitas, una API de UUID por fin cerrada, y un puente cada vez más sólido entre Kotlin y Swift para quien mantiene apps multiplataforma.
Más información y la lista completa de cambios, en la documentación oficial de Kotlin 2.4.0.
Si quieres ver cómo encaja esto con el resto del ecosistema Kotlin, puedes revisar nuestros artículos sobre Kotlin Multiplatform y Kotlin/Wasm.
