{"id":63818,"date":"2020-08-04T00:21:57","date_gmt":"2020-08-04T00:21:57","guid":{"rendered":"http:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=63818"},"modified":"2020-08-04T00:21:57","modified_gmt":"2020-08-04T00:21:57","slug":"kotlin-1-4-m3-ya-esta-aqui-cambios-en-la-biblioteca-estandar","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/es\/kotlin\/2020\/08\/kotlin-1-4-m3-ya-esta-aqui-cambios-en-la-biblioteca-estandar\/","title":{"rendered":"Kotlin 1.4-M3 ya est\u00e1 aqu\u00ed: cambios en la biblioteca est\u00e1ndar"},"content":{"rendered":"<p>Hoy nos complace presentarle la \u00faltima vista previa de Kotlin 1.4 \u2013 <strong>1.4-M3<\/strong>. En este art\u00edculo le mostraremos los cambios de la biblioteca est\u00e1ndar de Kotlin que encontrar\u00e1 en esta vista previa. En M3 tambi\u00e9n se han actualizado otros componentes; hablaremos de ellos pronto en otro art\u00edculo del blog, cuando lancemos la versi\u00f3n candidata (1.4-RC), que abarcar\u00e1 todo el \u00e1mbito de Kotlin 1.4.<\/p>\n<p><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#how-to-try\"><img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/Blog_Banners_m3_1500h751.png\" alt=\"\" width=\"1501\" height=\"752\" class=\"alignnone size-full wp-image-55596\" \/><\/a><\/p>\n<p>Los cambios en la biblioteca est\u00e1ndar de 1.4-M3 incluyen:<\/p>\n<ul>\n<li>Las bibliotecas de JVM ahora incluyen el descriptor <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#module-info\"><code>module-info<\/code>.<\/a><\/li>\n<p>Se han a\u00f1adido <\/p>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#fun-interfaces-in-stdlib\">interfaces funcionales<\/a> a la biblioteca est\u00e1ndar<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#collection-operations\">Nueva colecci\u00f3n de operaciones<\/a> para cubrir casos reales<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#common-throws-annotation\">Anotaci\u00f3n <code>@Throws<\/code><\/a> en la biblioteca com\u00fan<\/li>\n<li>Anulaci\u00f3n de algunas <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#equality-in-floating-point-arrays\">funciones en vectores de punto flotante<\/a><\/li>\n<\/ul>\n<p>Puede encontrar la lista completa de cambios en el <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/blob\/1.4-M3\/ChangeLog.md\" target=\"_blank\" rel=\"noopener\">registro de cambios<\/a>. Como siempre, estamos enormemente agradecidos a nuestros <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#external-contributors\">contribuidores externos<\/a>.<\/p>\n<p>Le agradecer\u00edamos mucho que <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#how-to-try\">probase la vista previa<\/a> y <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#share-your-feedback\">nos contase sus impresiones<\/a>.<\/p>\n<p><!--m\u00e1s--><\/p>\n<h2 id=\"module-info\">Los artefactos de la biblioteca est\u00e1ndar ahora incluyen descriptores module-info<\/h2>\n<p>Desde Java 9, puede modularizar su aplicaci\u00f3n gracias al proyecto Jigsaw. La herramienta <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/tools\/jlink.html\" target=\"_blank\" rel=\"noopener\"><strong>jlink<\/strong> <\/a> le permite generar una imagen de tiempo de ejecuci\u00f3n de Java que contenga solo los m\u00f3dulos de plataforma necesarios para su aplicaci\u00f3n. Antes ya pod\u00eda utilizar <code>jlink<\/code> con los artefactos de la biblioteca est\u00e1ndar Kotlin, pero ten\u00eda que usar artefactos por separado (los del clasificador &quot;modular&quot;), y la configuraci\u00f3n no era demasiado sencilla. La imposibilidad de incluir descriptores de m\u00f3dulo en artefactos principales se deb\u00eda a problemas con herramientas de Android que ahora se han resuelto.<\/p>\n<p>Kotlin 1.4 a\u00f1ade informaci\u00f3n de m\u00f3dulo <code>module-info.java<\/code> a artefactos de biblioteca est\u00e1ndar predeterminados, para que pueda utilizarlos f\u00e1cilmente con <code>jlink<\/code>. En Android, aseg\u00farese de usar la versi\u00f3n 3.2 o superior del complemento Gradle de android, que puede procesar correctamente jars con module-info.<\/p>\n<h2 id=\"fun-interfaces-in-stdlib\">Interfaces fun en la biblioteca est\u00e1ndar<\/h2>\n<p>Kotlin 1.4 es compatible con <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/12\/what-to-expect-in-kotlin-1-4-and-beyond\/#sam-conversions\">conversiones SAM para clases Kotlin<\/a>. Puede marcar una interfaz con un solo m\u00e9todo abstracto como <code>fun interface<\/code> y, a continuaci\u00f3n, pasar un lambda como argumento cuando se espere esa interfaz como par\u00e1metro. En la biblioteca est\u00e1ndar, las siguientes interfaces se declaran ahora como <code>fun interface<\/code>:<\/p>\n<ul>\n<li><code>Comparator<\/code><\/li>\n<li><code>ReadOnlyProperty<\/code><\/li>\n<li><code>PropertyDelegateProvider<\/code> (se introdujo en <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/05\/1-4-m2-standard-library\/#property-delegation-improvements\">1.4-M2<\/a>)<\/li>\n<\/ul>\n<p>Puede utilizar un constructor SAM que tome lambda como par\u00e1metro para crear una instancia. El c\u00f3digo resultante es mucho m\u00e1s simple:<\/p>\n<p>&lt;img class=&quot;alignnone size-full wp-image-55452&quot; src=&quot;<a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface-1.png\">https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface-1.png<\/a>&quot; onmouseover=&quot;this.src=&#8217;<a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface.gif\">https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface.gif<\/a>&#8216;;&quot;<br \/>\nonmouseout=&quot;this.src=&#8217;<a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface-1.png\">https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface-1.png<\/a>&#8216;;&quot; alt=&quot;&quot; \/&gt;<\/p>\n<h2 id=\"collection-operations\">Operaciones de colecci\u00f3n<\/h2>\n<ul>\n<li>Una nueva funci\u00f3n <code>sumOf<\/code> toma una funci\u00f3n de selector y devuelve una suma de sus valores en todos los elementos de una colecci\u00f3n. Es bastante similiar a las funciones <code>sumBy<\/code> y <code>sumByDouble<\/code>. La principal diferencia es que la nueva funci\u00f3n <code>sumOf<\/code> toma selectores con varios tipos de retorno, de modo que puede gestionar sumas de diferentes tipos del mismo modo. Es decir, sumOf produce sumas de los tipos <code>Int<\/code>, <code>Long<\/code>, <code>Double<\/code>, <code>UInt<\/code>, <code>ULong<\/code>. En la JVM tambi\u00e9n est\u00e1n disponibles <code>BigInteger<\/code> y <code>BigDecimal<\/code>.\n<pre class=\"kotlin-code\" data-version=\"1.4-M3\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\r\ndata class OrderItem(val name: String, val price: Double, val count: Int)\r\n\r\nfun main() {\r\n\/\/sampleStart\r\n    val order = listOf&lt;OrderItem&gt;(\r\n        OrderItem(&quot;Cake&quot;, price = 10.0, count = 1),\r\n\tOrderItem(&quot;Coffee&quot;, price = 2.5, count = 3),\r\n        OrderItem(&quot;Tea&quot;, price = 1.5, count = 2))\r\n    \r\n    val total = order.sumOf { it.price * it.count} \/\/ Double\r\n    val count = order.sumOf { it.count } \/\/ Int\r\n\/\/sampleEnd\r\n    println(&quot;You&#039;ve ordered $count items that cost $total in total&quot;)\r\n}\r\n<\/pre>\n<\/li>\n<li>\nLas funciones <code>min<\/code> y <code>max<\/code> ahora se llaman <code>minOrNull<\/code> y <code>maxOrNull<\/code>. Desde su introducci\u00f3n en 1.0, <code>min<\/code> y <code>max<\/code> han dado <code>null<\/code> en colecciones vac\u00edas. Esto contradice la convenci\u00f3n de nomenclatura utilizada en las API de colecciones Kotlin: las funciones sin el sufijo <code>*OrNull<\/code> dan una excepci\u00f3n si la colecci\u00f3n receptora est\u00e1 vac\u00eda. Para obtener un <code>null<\/code> en su lugar, deb\u00eda utilizar la versi\u00f3n <code>*OrNull<\/code> de la funci\u00f3n, por ejemplo, <code>firstOrNull<\/code>.<br \/>\nAs\u00ed pues, decidimos cambiar gradualmente el comportamiento de <code>min<\/code> y <code>max<\/code>. En 1.4-M3 a\u00f1adimos <code>minOrNull<\/code> y <code>maxOrNull<\/code> como sin\u00f3nimos de <code>min<\/code> y <code>max<\/code> e iniciamos el ciclo de anulaci\u00f3n de <code>min<\/code> y <code>max<\/code> para reintroducirlos con tipos de retorno no null.\n<\/li>\n<li>\nHemos introducido las funciones <code>minOf<\/code> y <code>maxOf<\/code> que devuelven el valor m\u00ednimo o m\u00e1ximo de la funci\u00f3n selectora indicada en los elementos de la colecci\u00f3n. Estas funciones abordan el caso en el que era necesario escribir <code>map { selector }.max()!!<\/code> o <code>maxBy { selector }!!.selector<\/code> (o <code>min<\/code> y <code>minBy<\/code>).<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.4-M3\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\r\ndata class OrderItem(val name: String, val price: Double, val count: Int)\r\n\r\nfun main() {\r\n\/\/sampleStart\r\n    val order = listOf&lt;OrderItem&gt;(\r\n        OrderItem(&quot;Cake&quot;, price = 10.0, count = 1),\r\n        OrderItem(&quot;Coffee&quot;, price = 2.5, count = 3),\r\n        OrderItem(&quot;Tea&quot;, price = 1.5, count = 2))\r\n    \r\n    val highestPrice = order.maxOf { it.price }\r\n\/\/sampleEnd    \r\n    println(&quot;The most expensive item in the order costs $highestPrice&quot;)\r\n}\r\n<\/pre>\n<p>En pro de la coherencia con las API existentes, tambi\u00e9n a\u00f1adimos <code>minOfWith<\/code> y <code>maxOfWith<\/code>, que toman un <code>Comparator<\/code> como argumento.<br \/>\nLas cuatro nuevas funciones siguen la convenci\u00f3n no null que hemos descrito antes: lanzan excepciones en colecciones vac\u00edas y cuentan con versiones <code>*OrNull<\/code> que dan <code>null<\/code> en este caso.\n<\/li>\n<li>\nLas nuevas sobrecargas para <code>flatMap<\/code> y <code>flatMapTo<\/code> le permiten usar transformaciones con tipos de retorno que no coinciden con el tipo de receptor, es decir:<\/p>\n<ul>\n<li>transformaciones a <code>Sequence<\/code> en <code>Iterable<\/code>, <code>Array<\/code>, y <code>Map<\/code><\/li>\n<li>transformaciones a <code>Iterable<\/code> en <code>Sequence<\/code><\/li>\n<\/ul>\n<pre class=\"kotlin-code\" data-version=\"1.4-M3\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\r\nfun main() {\r\n\/\/sampleStart\r\n    val list = listOf(&quot;kot&quot;, &quot;lin&quot;)\r\n    val lettersList = list.flatMap { it.asSequence() }\r\n    val lettersSeq = list.asSequence().flatMap { it.toList() }\r\n\/\/sampleEnd    \r\n    println(lettersList)\r\n    println(lettersSeq.toList())\r\n}\r\n<\/pre>\n<\/li>\n<li>\n Se ha a\u00f1adido una nueva funci\u00f3n <code>flatMapIndexed<\/code> como contrapartida para <code>flatMap<\/code>. Como quiz\u00e1 ya sepa, <code>Indexed<\/code> en el nombre de una funci\u00f3n que procesa colecciones significa que la operaci\u00f3n aplicada tiene el elemento \u00edndice como par\u00e1metro.<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.4-M3\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\r\nfun main() {\r\n\/\/sampleStart\r\n    val list = listOf(&quot;hello&quot;, &quot;kot&quot;, &quot;lin&quot;, &quot;world&quot;)\r\n    val kotlin = list.flatMapIndexed { index, item -&gt;\r\n        if (index in 1..2) item.toList() else emptyList() \r\n    }\r\n\/\/sampleEnd\r\n    println(kotlin)\r\n}\r\n<\/pre>\n<\/li>\n<\/ul>\n<h2 id=\"common-throws-annotation\">Anotaci\u00f3n @Throws com\u00fan<\/h2>\n<p>Aunque Kotlin <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/exceptions.html#checked-exceptions\" target=\"_blank\" rel=\"noopener\">no tiene excepciones comprobadas<\/a>, utiliza la anotaci\u00f3n <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.jvm\/-throws\/\" target=\"_blank\" rel=\"noopener\"><a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a><\/a> para la interoperabilidad con lenguajes que s\u00ed las tienen, como Java y Swift. Antes hab\u00eda anotaciones separadas con este nombre para JVM (<code>kotlin.jvm.Throws<\/code>) y Native (<code>kotlin.native.Throws<\/code>). A partir de 1.4-M3, la anotaci\u00f3n<a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a> est\u00e1 disponible como parte de la biblioteca com\u00fan directamente en el paquete <code>kotlin<\/code> (<code>kotlin.Throws<\/code>), lo que le permite utilizarla en el c\u00f3digo com\u00fan.<\/p>\n<h3 id=\"throws-in suspending-functions-in-swift-and-objective-c\">@Throws en funciones de suspensi\u00f3n en Swift y Objective-C<\/h3>\n<p>En 1.4-M1 anunciamos <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/03\/kotlin-1-4-m1-released\/#kotlin-native-exception-handling\">cambios en el tratamiento de excepciones en la interoperabilidad de Objective-C\/Swift<\/a>: ahora se lanza <code>NSError<\/code> solo para excepciones que son instancias de clases especificadas como par\u00e1metros de la anotaci\u00f3n <a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a> (o sus subclases). En 1.4-M2 introdujimos <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/06\/kotlin-1-4-m2-released\/#native-suspending-functions-support\">compatibilidad b\u00e1sica con las funciones de suspensi\u00f3n de Kotlin en Swift y Objective-C<\/a>. En 1.4-M3 hay peque\u00f1os cambios en el comportamiento de funciones de suspensi\u00f3n anotadas con <a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a>:<\/p>\n<ul>\n<li>Si ha anotado una <code>suspend fun<\/code> con <code>@Throws<\/code>, tendr\u00e1 que especificar <code>CancellationException::class<\/code> como par\u00e1metro de la anotaci\u00f3n <code>@Throws<\/code>. De lo contrario, obtendr\u00e1 un error de compilaci\u00f3n.<\/li>\n<li>Si no hay anotaci\u00f3n <code>@Throws<\/code> en una <code>suspend fun<\/code>, esta utilizar\u00e1 impl\u00edcitamente <code>@Throws(CancellationException::class)<\/code> cuando la llame desde Swift.<\/li>\n<\/ul>\n<h2 id=\"equality-in-floating-point-arrays\">Igualdad en vectores de punto flotante<\/h2>\n<p>Muchos de ustedes ya conocen estas pr\u00e1cticas funciones de extensi\u00f3n para tipos de contenedores: <code>contains<\/code>, <code>indexOf<\/code> y <code>lastIndexOf<\/code>. Hace un tiempo nos dimos cuenta de que su comportamiento en vectores de punto flotante (<code>FloatArray<\/code> y <code>DoubleArray<\/code>) podr\u00edan crear controversia y parecer incorrectos.<br \/>\nPara ser m\u00e1s espec\u00edficos, utilizan el est\u00e1ndar <a href=\"https:\/\/en.wikipedia.org\/wiki\/IEEE_754\" target=\"_blank\" rel=\"noopener\">IEEE 754<\/a> en aritm\u00e9tica de punto flotante. Este est\u00e1ndar define las siguientes reglas de igualdad para casos especiales:<\/p>\n<ul>\n<li><code>NaN<\/code> <strong>no es igual a<\/strong> <code>NaN<\/code><\/li>\n<li><code>-0.0<\/code> <strong>es igual a<\/strong> <code>0.0<\/code><\/li>\n<\/ul>\n<p>Estas reglas pueden dar lugar a resultados inesperados, por ejemplo:<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.4-M3\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\r\nfun main() {\r\n\/\/sampleStart\r\n    val darray = doubleArrayOf(Double.NaN, 0.0)\r\n    println (darray.contains(darray[0])) \/\/ false!\r\n\/\/sampleEnd\r\n}\r\n<\/pre>\n<p>Adem\u00e1s, ese comportamiento no es coherente con c\u00f3mo funcionan las mismas funciones en listas, porque usan la igualdad de <em>orden total<\/em>:<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.4-M3\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\r\nfun main() {\r\n\/\/sampleStart\r\n    val listOfDouble: List&lt;Double&gt; = listOf(0.0, Double.NaN)\r\n    val listFromArray: List&lt;Double&gt; = doubleArrayOf(0.0, Double.NaN).asList()\r\n\r\n    println(listOfDouble.contains(Double.NaN))  \/\/ true\r\n    println(listFromArray.contains(Double.NaN))  \/\/ false in previous versions\r\n\/\/sampleEnd\r\n}\r\n<\/pre>\n<p>En 1.4-M3 iniciamos el ciclo de anulaci\u00f3n de las funciones de extensi\u00f3n <code>contains<\/code>, <code>indexOf<\/code> y <code>lastIndexOf<\/code> de <code>FloatArray<\/code> y <code>DoubleArray<\/code>. Al tratar de utilizarlas, ver\u00e1 advertencias con instrucciones sobre c\u00f3mo sustituir los usos de estas funciones.<br \/>\nEn versiones futuras, continuaremos anulando hasta el nivel <code>ERROR<\/code> y eliminaremos estas funciones de la API p\u00fablica.<\/p>\n<h2 id=\"converting-from-ktype-to-java-type\">Conversi\u00f3n de KType a Java Type<\/h2>\n<p>En Kotlin 1.3.40, <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/06\/kotlin-1-3-40-released\/#type-of\">a\u00f1adimos una pr\u00e1ctica funci\u00f3n <code>typeOf<\/code><\/a> a la biblioteca est\u00e1ndar. Esta funci\u00f3n devuelve una representaci\u00f3n de tiempo de ejecuci\u00f3n del tipo reificado indicado <code>T<\/code> como instancia de <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.reflect\/-k-type\/\" target=\"_blank\" rel=\"noopener\"><code>KType<\/code><\/a>. Sin embargo, en muchos casos de uso pr\u00e1ctico, necesita trabajar con objetos Java reflection <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/reflect\/Type.html\" target=\"_blank\" rel=\"noopener\"><code>java.lang.reflect.Type<\/code><\/a> en lugar de con <code>KType<\/code>. Ya era posible efectuar la conversi\u00f3n necesaria, pero esto requer\u00eda utilizar la dependencia <code>kotlin-reflect<\/code> completa. Ahora hemos actualizado la biblioteca est\u00e1ndar de modo que se pueda convertir <code>KType<\/code> a Java <code>Type<\/code>: una propiedad de extensi\u00f3n <code>KType.javaType<\/code> que devuelve Java <code>Type<\/code>:<\/p>\n<pre class=\"kotlin-code\" data-version=\"1.4-M3\" theme=\"idea\" indent=\"4\" style=\"visibility: hidden; padding: 36px 0;\">\r\nimport kotlin.reflect.javaType\r\nimport kotlin.reflect.typeOf\r\n\r\n@OptIn(ExperimentalStdlibApi::class)\r\ninline fun &lt;reified T&gt; accessReifiedTypeArg() {\r\n   val kType = typeOf&lt;T&gt;()\r\n   println(&quot;Kotlin type: $kType&quot;)\r\n   println(&quot;Java type: ${kType.javaType}&quot;)\r\n}\r\n\r\n@OptIn(ExperimentalStdlibApi::class)\r\nfun main() {\r\n   accessReifiedTypeArg&lt;String&gt;()\r\n   \/\/ Kotlin type: kotlin.String\r\n   \/\/ Java type: class java.lang.String\r\n  \r\n   accessReifiedTypeArg&lt;List&lt;String&gt;&gt;()\r\n   \/\/ Kotlin type: kotlin.collections.List&lt;kotlin.String&gt;\r\n   \/\/ Java type: java.util.List&lt;java.lang.String&gt;\r\n}\r\n<\/pre>\n<p>Tenga en cuenta que, hasta ahora, el Java <code>Type<\/code> obtenido no se comporta correctamente en algunos casos especiales (como par\u00e1metros de tipo anotado o varianza de sitio de declaraci\u00f3n), as\u00ed que <code>KType.javaType<\/code> contin\u00faa siendo experimental. Encontrar\u00e1 m\u00e1s detalles sobre los casos no compatibles en esta <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-32241#focus=streamItem-27-4200156.0-0\" target=\"_blank\" rel=\"noopener\">incidencia<\/a>.<\/p>\n<h2>Compatibilidad<\/h2>\n<p>Tenga en cuenta que Kotlin 1.4 no es compatible con versiones anteriores a 1.3 en algunos casos especiales. El comit\u00e9 del lenguaje ha estudiado todos esos casos y aparecer\u00e1n en la \u201cGu\u00eda de compatibilidad\u201d (similar a <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/compatibility-guide-13.html\" target=\"_blank\" rel=\"noopener\">esta<\/a>). Por ahora, encontrar\u00e1 esta lista en <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT?q=Tag:%20language-committee-approved%20Target%20versions:%201.4-M3,%201.4-M2,%201.4-M1,%201.4.0\" target=\"_blank\" rel=\"noopener\">YouTrack<\/a>.<\/p>\n<h3>Notas previas al lanzamiento<\/h3>\n<blockquote><p>\n  Tenga en cuenta que las garant\u00edas de compatibilidad con versiones anteriores no cubren las versiones previas al lanzamiento. Las funcionalidades y API pueden cambiar en lanzamientos posteriores. Cuando llegamos a una RC final, el compilador expulsar\u00e1 todos los binarios producidos por las versiones previas al lanzamiento y se le pedir\u00e1 que vuelva a compilar todo lo que compil\u00f3 con la 1.4\u2011Mx.\n<\/p><\/blockquote>\n<h2 id=\"how-to-try\">C\u00f3mo probar las funcionalidades m\u00e1s recientes<\/h2>\n<p>Como siempre, puede <strong>probar Kotlin online<\/strong> en <a href=\"http:\/\/play.kotl.in\/\" target=\"_blank\" rel=\"noopener\">play.kotl.in<\/a>.<\/p>\n<p>En <strong>IntelliJ IDEA<\/strong> y <strong>Android Studio<\/strong>, puede actualizar el complemento de Kotlin a la versi\u00f3n 1.4-M3. Consulte <a href=\"https:\/\/kotlinlang.org\/eap\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">c\u00f3mo hacerlo<\/a>.<\/p>\n<p>Si quiere trabajar en proyectos existentes creados antes de la instalaci\u00f3n de la versi\u00f3n preliminar, necesita <a href=\"https:\/\/kotlinlang.org\/eap\/configure-build-for-eap.html\" target=\"_blank\" rel=\"noopener\">configurar la compilaci\u00f3n acorde a la versi\u00f3n preliminar en Gradle o Maven<\/a>.<\/p>\n<p>Puede descargar <strong>el compilador de l\u00ednea de comando<\/strong> desde la <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.4-M3\" target=\"_blank\" rel=\"noopener\">p\u00e1gina de lanzamiento de Github<\/a>.<\/p>\n<p>Puede usar las siguientes versiones de <strong>las bibliotecas<\/strong> publicadas junto a este lanzamiento:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.atomicfu\" target=\"_blank\" rel=\"noopener\">kotlinx.atomicfu<\/a> versi\u00f3n: <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.atomicfu\/0.14.3-1.4-M3\" target=\"_blank\" rel=\"noopener\">0.14.3-1.4-M3<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\" target=\"_blank\" rel=\"noopener\">kotlinx.coroutines<\/a> versi\u00f3n: <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.coroutines\/1.3.7-1.4-M3\" target=\"_blank\" rel=\"noopener\">1.3.7-1.4-M3<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.serialization\" target=\"_blank\" rel=\"noopener\">kotlinx.serialization<\/a> versi\u00f3n: <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.serialization.runtime\/0.20.0-1.4-M3\" target=\"_blank\" rel=\"noopener\">0.20.0-1.4-M3<\/a><\/li>\n<li><a href=\"https:\/\/ktor.io\/\" target=\"_blank\" rel=\"noopener\">ktor<\/a> versi\u00f3n: <a href=\"https:\/\/bintray.com\/kotlin\/ktor\/ktor\/1.3.2-1.4-M3\" target=\"_blank\" rel=\"noopener\">1.3.2-1.4-M3<\/a><\/li>\n<\/ul>\n<p>Los detalles del lanzamiento y la lista de bibliotecas compatibles tambi\u00e9n est\u00e1n disponibles <a href=\"https:\/\/kotlinlang.org\/eap\/#build-details\" target=\"_blank\" rel=\"noopener\">aqu\u00ed<\/a>.<\/p>\n<h2 id=\"share-your-feedback\">Comparta con nosotros sus comentarios<\/h2>\n<p>Le agracedemos todos sus informes de errores en nuestro <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">sistema de seguimiento de incidencias<\/a>, y haremos todo lo posible para solucionar todas las incidencias m\u00e1s importantes antes del lanzamiento final.<\/p>\n<p>Tambi\u00e9n le animamos a unirse al <em><a href=\"https:\/\/app.slack.com\/client\/T09229ZC6\/C0KLZSCHF\" target=\"_blank\" rel=\"noopener\">canal #eap<\/a><\/em> en <a href=\"https:\/\/app.slack.com\/client\/T09229ZC6\/C0KLZSCHF\" target=\"_blank\" rel=\"noopener\">KotlinSlack<\/a> (obtenga una invitaci\u00f3n <a href=\"http:\/\/slack.kotlinlang.org\/\" target=\"_blank\" rel=\"noopener\">aqu\u00ed<\/a>). En este canal puede formular preguntas, participar en discusiones y obtener notificaciones de nuevos builds de vista previa.<\/p>\n<p>\u00a1Adelante con Kotlin!<\/p>\n<h2 id=\"external-contributors\">Contribuciones externas<\/h2>\n<p>Nos gustar\u00eda agradecer a todos los contribuidores externos cuyas solicitudes de incorporaci\u00f3n de cambios se han incluido en esta versi\u00f3n:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/t-kameyama\" target=\"_blank\" rel=\"noopener\">Toshiaki Kameyama<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/sfs\" target=\"_blank\" rel=\"noopener\">Steven Sch\u00e4fer<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jsjeon\" target=\"_blank\" rel=\"noopener\">Jinseong Jeon<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/pyos\" target=\"_blank\" rel=\"noopener\">pyos<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/punzki\" target=\"_blank\" rel=\"noopener\">Mark Punzalan<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/rapturemain\" target=\"_blank\" rel=\"noopener\">rapturemain<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/tihonovcore\" target=\"_blank\" rel=\"noopener\">Vitaly Tihonov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/madsager\" target=\"_blank\" rel=\"noopener\">Mads Ager<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/subroh0508\" target=\"_blank\" rel=\"noopener\">Subroh Nishikori<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/juan-chen\" target=\"_blank\" rel=\"noopener\">Juan Chen<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/gcx11\" target=\"_blank\" rel=\"noopener\">gcx11<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/rbares\" target=\"_blank\" rel=\"noopener\">Robert Bares<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/tunedal\" target=\"_blank\" rel=\"noopener\">Henrik Tunedal<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/lunakoly\" target=\"_blank\" rel=\"noopener\">Nick<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Dmitry-Borodin\" target=\"_blank\" rel=\"noopener\">Dmitry Borodin<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/efemoney\" target=\"_blank\" rel=\"noopener\">Efeturi Money<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kevinmost\" target=\"_blank\" rel=\"noopener\">Kevin Most<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/anstkras\" target=\"_blank\" rel=\"noopener\">Anastasiya Krasnoryadtseva<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kandersen\" target=\"_blank\" rel=\"noopener\">Kristoffer Andersen<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mpetrov\" target=\"_blank\" rel=\"noopener\">Martin Petrov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/gharrma\" target=\"_blank\" rel=\"noopener\">Matthew Gharrity<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mikesamuel\" target=\"_blank\" rel=\"noopener\">Mike Samuel<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/McCreeMainer\" target=\"_blank\" rel=\"noopener\">Mikhail Likholetov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/segunfamisa\" target=\"_blank\" rel=\"noopener\">Segun Famisa<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kozaxinan\" target=\"_blank\" rel=\"noopener\">Sinan Kozak<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/vadimsemenov\" target=\"_blank\" rel=\"noopener\">Vadim Semenov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/valery1707\" target=\"_blank\" rel=\"noopener\">Valeriy Vyrva<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/turansky\" target=\"_blank\" rel=\"noopener\">Victor Turansky<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Monchi\" target=\"_blank\" rel=\"noopener\">Yuku Kotani<\/a><\/li>\n<\/ul>\n","protected":false},"author":1086,"featured_media":59211,"comment_status":"open","ping_status":"closed","template":"","categories":[826,909,907],"tags":[477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/kotlin\/63818"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/comments?post=63818"}],"version-history":[{"count":0,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/kotlin\/63818\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media\/59211"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/media?parent=63818"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/categories?post=63818"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/tags?post=63818"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/es\/wp-json\/wp\/v2\/cross-post-tag?post=63818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}