{"id":63817,"date":"2020-08-03T23:52:30","date_gmt":"2020-08-03T23:52:30","guid":{"rendered":"http:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=63817"},"modified":"2020-08-03T23:52:30","modified_gmt":"2020-08-03T23:52:30","slug":"o-kotlin-1-4-m3-foi-lancado-mudancas-na-biblioteca-padrao","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/pt-br\/kotlin\/2020\/08\/o-kotlin-1-4-m3-foi-lancado-mudancas-na-biblioteca-padrao\/","title":{"rendered":"O Kotlin 1.4-M3 foi lan\u00e7ado: mudan\u00e7as na biblioteca padr\u00e3o"},"content":{"rendered":"<p>O Kotlin 1.4-M3 foi lan\u00e7ado: mudan\u00e7as na biblioteca padr\u00e3o<\/p>\n<p>Hoje temos o prazer de apresentar a \u00faltima vers\u00e3o de pr\u00e9-visualiza\u00e7\u00e3o do Kotlin 1.4 \u2013 <strong>1.4-M3<\/strong>. Neste post vamos gui\u00e1-lo atrav\u00e9s das mudan\u00e7as \u00e0 biblioteca padr\u00e3o do Kotlin que fazem parte desta pr\u00e9-visualiza\u00e7\u00e3o. Outros componentes tamb\u00e9m est\u00e3o sendo atualizados na vers\u00e3o M3. Eles ser\u00e3o abordados em breve em outro post com a vers\u00e3o release candidate (1.4-RC), que finalizar\u00e1 o escopo do 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>As mudan\u00e7as na biblioteca padr\u00e3o na vers\u00e3o 1.4-M3 incluem:<\/p>\n<ul>\n<li>As bibliotecas da JVM agora v\u00eam com o <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#module-info\">descritor <code>module-info<\/code><\/a><\/li>\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 funcionais<\/a> foram acrescentadas \u00e0 biblioteca padr\u00e3o<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#collection-operations\">Novas opera\u00e7\u00f5es para cole\u00e7\u00f5es<\/a> para lidar com situa\u00e7\u00f5es da vida real<\/li>\n<li><a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#common-throws-annotation\">Anota\u00e7\u00e3o <code>@Throws<\/code><\/a> na biblioteca comum<\/li>\n<li>Depreca\u00e7\u00e3o de algumas <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#equality-in-floating-point-arrays\">fun\u00e7\u00f5es em arrays de ponto-flutuante<\/a><\/li>\n<\/ul>\n<p>Voc\u00ea pode encontrar a lista completa de mudan\u00e7as no <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/blob\/1.4-M3\/ChangeLog.md\" target=\"_blank\" rel=\"noopener\">log de altera\u00e7\u00f5es<\/a>. Como sempre, somos muito gratos aos nossos <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#external-contributors\">colaboradores externos<\/a>.<\/p>\n<p>Apreciaremos bastante se voc\u00ea puder <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#how-to-try\">experimentar a pr\u00e9-visualiza\u00e7\u00e3o<\/a> e <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/07\/kotlin-1-4-m3-is-out-standard-library-changes#share-your-feedback\">compartilhar suas impress\u00f5es<\/a>.<\/p>\n<p><!--mais--><\/p>\n<h2 id=\"module-info\">Artefatos da biblioteca padr\u00e3o agora incluem descritores module-info<\/h2>\n<p>A partir do Java 9, voc\u00ea pode modularizar sua aplica\u00e7\u00e3o gra\u00e7as ao projeto Jigsaw. A <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/tools\/jlink.html\" target=\"_blank\" rel=\"noopener\">ferramenta <strong>jlink<\/strong><\/a> permite que voc\u00ea gere uma imagem Java runtime contendo apenas os m\u00f3dulos da plataforma que s\u00e3o necess\u00e1rios para sua aplica\u00e7\u00e3o. Antes j\u00e1 era poss\u00edvel usar o <code>jlink<\/code> com artefatos da biblioteca padr\u00e3o Kotlin, mas era preciso usar artefatos separados \u2013 apenas os que tinham o classificador &quot;modular&quot; \u2013 e todo o processo de configura\u00e7\u00e3o n\u00e3o era simples. A impossibilidade de incluir descritores de m\u00f3dulos nos artefatos principais foi causada por problemas nas ferramentas para Android, que j\u00e1 foram corrigidos.<\/p>\n<p>O Kotlin 1.4 acrescenta as informa\u00e7\u00f5es sobre m\u00f3dulos de <code>module-info.java<\/code> aos artefatos default da biblioteca padr\u00e3o, para que voc\u00ea possa us\u00e1-los com o <code>jlink<\/code> com facilidade. No Android, certifique-se de estar usando o plugin Android Gradle vers\u00e3o 3.2 ou superior, que \u00e9 capaz de processar corretamente jars contendo module-info.<\/p>\n<h2 id=\"fun-interfaces-in-stdlib\">Suporte a fun interface na biblioteca padr\u00e3o<\/h2>\n<p>O Kotlin 1.4 suporta <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/12\/what-to-expect-in-kotlin-1-4-and-beyond\/#sam-conversions\">convers\u00f5es SAM para classes Kotlin<\/a>. Voc\u00ea pode marcar uma interface que tenha um \u00fanico m\u00e9todo abstrato como uma <code>fun interface<\/code> e depois passar um lambda como argumento quando essa interface for esperada como par\u00e2metro. Na biblioteca padr\u00e3o, as seguintes interfaces s\u00e3o agora declaradas 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> (foi introduzida em <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>Voc\u00ea pode usar um construtor SAM que recebe um lambda como par\u00e2metro para criar uma inst\u00e2ncia. O c\u00f3digo resultante \u00e9 muito mais simples:<\/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\">Opera\u00e7\u00f5es de cole\u00e7\u00f5es<\/h2>\n<ul>\n<li>Uma nova fun\u00e7\u00e3o <code>sumOf<\/code> recebe uma fun\u00e7\u00e3o seletora e retorna uma soma de seus valores sobre todos os elementos de uma cole\u00e7\u00e3o. \u00c9 muito parecida com as fun\u00e7\u00f5es <code>sumBy<\/code> e <code>sumByDouble<\/code> que j\u00e1 existem. A principal diferen\u00e7a \u00e9 que a nova fun\u00e7\u00e3o <code>sumOf<\/code> recebe seletores com v\u00e1rios tipos de retorno, permitindo que voc\u00ea lide com somas de diferentes tipos da mesma forma. Ou seja, sumOf produz somas dos tipos <code>Int<\/code>, <code>Long<\/code>, <code>Double<\/code>, <code>UInt<\/code>, <code>ULong<\/code>. Na JVM tamb\u00e9m est\u00e3o dispon\u00edveis os tipos <code>BigInteger<\/code> e <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;Voc\u00ea solicitou $count itens que custam $total no total&quot;)\r\n}\r\n<\/pre>\n<\/li>\n<li>\nAs fun\u00e7\u00f5es <code>min<\/code> e <code>max<\/code> foram renomeadas para <code>minOrNull<\/code> e <code>maxOrNull<\/code>. Desde sua introdu\u00e7\u00e3o na vers\u00e3o 1.0, as fun\u00e7\u00f5es <code>min<\/code> e <code>max<\/code> t\u00eam retornado <code>null<\/code> em cole\u00e7\u00f5es vazias. Isto contradiz a conven\u00e7\u00e3o de nomenclatura usada em toda a API de cole\u00e7\u00f5es do Kotlin: fun\u00e7\u00f5es sem o sufixo <code>*OrNull<\/code> lan\u00e7am uma exce\u00e7\u00e3o se a cole\u00e7\u00e3o receptora estiver vazia. Se voc\u00ea ainda quiser receber um <code>null<\/code>, voc\u00ea deve usar a vers\u00e3o <code>*OrNull<\/code> da fun\u00e7\u00e3o, por exemplo, <code>firstOrNull<\/code>.<br \/>\nPortanto, decidimos gradualmente alterar o comportamento de <code>min<\/code> e <code>max<\/code>. Na vers\u00e3o 1.4-M3, estamos acrescentando <code>minOrNull<\/code> e <code>maxOrNull<\/code> como sin\u00f4nimos de <code>min<\/code> e <code>max<\/code> e iniciando o ciclo de depreca\u00e7\u00e3o para <code>min<\/code> e <code>max<\/code> para que elas sejam reintroduzidas com tipos de retorno que n\u00e3o sejam null.\n<\/li>\n<li>\nIntroduzimos as fun\u00e7\u00f5es <code>minOf<\/code> e <code>maxOf<\/code> que retornam o valor m\u00ednimo ou m\u00e1ximo da fun\u00e7\u00e3o seletora fornecida sobre os itens da cole\u00e7\u00e3o. Estas fun\u00e7\u00f5es resolvem a situa\u00e7\u00e3o na qual era necess\u00e1rio escrever <code>map { selector }.max()!!<\/code> ou <code>maxBy { selector }!!.selector<\/code> (ou <code>min<\/code> e <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;O item mais caro do pedido custa $highestPrice&quot;)\r\n}\r\n<\/pre>\n<p>Para manter a consist\u00eancia com a API existente, tamb\u00e9m acrescentamos <code>minOfWith<\/code> e <code>maxOfWith<\/code>, que recebem um <code>Comparator<\/code> como argumento.<br \/>\nTodas essas novas fun\u00e7\u00f5es seguem a conven\u00e7\u00e3o non-null que descrevemos acima: elas lan\u00e7am exce\u00e7\u00f5es em cole\u00e7\u00f5es vazias e possuem vers\u00f5es <code>*OrNull<\/code> que retornam <code>null<\/code> neste caso.\n<\/li>\n<li>\nNovas sobrecargas para <code>flatMap<\/code> e <code>flatMapTo<\/code> permitem que voc\u00ea use transforma\u00e7\u00f5es com tipos de retorno que n\u00e3o combinam com o tipo do receptor, ou seja:<\/p>\n<ul>\n<li>transforma\u00e7\u00f5es para <code>Sequence<\/code> em <code>Iterable<\/code>, <code>Array<\/code> e <code>Map<\/code><\/li>\n<li>transforma\u00e7\u00f5es para <code>Iterable<\/code> em <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 Uma nova fun\u00e7\u00e3o <code>flatMapIndexed<\/code> foi acrescentada como uma contrapartida para <code>flatMap<\/code>. Como voc\u00ea talvez j\u00e1 saiba, <code>Indexed<\/code> no nome de uma fun\u00e7\u00e3o que processa cole\u00e7\u00f5es significa que a opera\u00e7\u00e3o aplicada recebe o \u00edndice do elemento como par\u00e2metro.<\/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\">Anota\u00e7\u00e3o @Throws comum<\/h2>\n<p>Embora Kotlin <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/exceptions.html#checked-exceptions\" target=\"_blank\" rel=\"noopener\">n\u00e3o tenha exce\u00e7\u00f5es checadas<\/a>, ele usa a <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.jvm\/-throws\/\" target=\"_blank\" rel=\"noopener\">anota\u00e7\u00e3o <a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a><\/a> para garantir a interoperabilidade com linguagens que as possuem, tais como Java e Swift. Antes, havia anota\u00e7\u00f5es separadas com este nome para a JVM (<code>kotlin.jvm.Throws<\/code>) e Native (<code>kotlin.native.Throws<\/code>). A partir da vers\u00e3o 1.4-M3, a anota\u00e7\u00e3o <a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a> est\u00e1 dispon\u00edvel como parte da biblioteca comum diretamente no pacote <code>kotlin<\/code> (<code>kotlin.Throws<\/code>), o que permite que voc\u00ea a utilize no c\u00f3digo comum.<\/p>\n<h3 id=\"throws-in suspending-functions-in-swift-and-objective-c\">@Throws em fun\u00e7\u00f5es suspensas no Swift e Objective-C<\/h3>\n<p>Na vers\u00e3o 1.4-M1 anunciamos <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/03\/kotlin-1-4-m1-released\/#kotlin-native-exception-handling\">mudan\u00e7as no tratamento de exce\u00e7\u00f5es na interop Objective-C\/Swift<\/a>: agora <code>NSError<\/code> \u00e9 lan\u00e7ada apenas para exce\u00e7\u00f5es que s\u00e3o inst\u00e2ncias de classes especificadas como par\u00e2metros de uma anota\u00e7\u00e3o <a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a> (ou suas subclasses). Na vers\u00e3o 1.4-M2 introduzimos <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2020\/06\/kotlin-1-4-m2-released\/#native-suspending-functions-support\">suporte b\u00e1sico para as fun\u00e7\u00f5es de suspens\u00e3o do Kotlin no Swift e Objective-C<\/a>. Na vers\u00e3o 1.4-M3 h\u00e1 pequenas mudan\u00e7as no comportamento das fun\u00e7\u00f5es de suspens\u00e3o anotadas com <a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a>:<\/p>\n<ul>\n<li>Se voc\u00ea tiver uma <code>suspend fun<\/code> anotada com <code>@Throws<\/code>, voc\u00ea precisa especificar <code>CancellationException::class<\/code> como par\u00e2metro da anota\u00e7\u00e3o <code>@Throws<\/code>. Caso contr\u00e1rio, voc\u00ea ter\u00e1 um erro de compila\u00e7\u00e3o.<\/li>\n<li>Se n\u00e3o houver anota\u00e7\u00e3o <code>@Throws<\/code> em uma <code>suspend fun<\/code>, ela ir\u00e1 usar implicitamente <code>@Throws(CancellationException::class)<\/code> quando for chamada pelo Swift.<\/li>\n<\/ul>\n<h2 id=\"equality-in-floating-point-arrays\">Igualdade em arrays de ponto-flutuante<\/h2>\n<p>Muitos de voc\u00eas conhecem estas fun\u00e7\u00f5es de extens\u00e3o pr\u00e1ticas para tipos de container \u2013 <code>contains<\/code>, <code>indexOf<\/code> e <code>lastIndexOf<\/code>. Algum tempo atr\u00e1s, descobrimos que seu comportamento em arrays de ponto-flutuante (<code>FloatArray<\/code> e <code>DoubleArray<\/code>) pode ser controverso e pode parecer incorreto.<br \/>\nPara ser mais espec\u00edfico, eles usam o padr\u00e3o <a href=\"https:\/\/en.wikipedia.org\/wiki\/IEEE_754\" target=\"_blank\" rel=\"noopener\">IEEE 754<\/a> para aritm\u00e9tica de ponto-flutuante. Este padr\u00e3o define as seguintes regras de igualdade para casos especiais:<\/p>\n<ul>\n<li><code>NaN<\/code> <strong>n\u00e3o \u00e9 igual a<\/strong> <code>NaN<\/code><\/li>\n<li><code>-0.0<\/code> <strong>\u00e9 igual a<\/strong> <code>0.0<\/code><\/li>\n<\/ul>\n<p>Tais regras podem levar a resultados inesperados, por exemplo:<\/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>Adicionalmente, tal comportamento \u00e9 inconsistente com a forma como essas mesmas fun\u00e7\u00f5es operam em listas, porque elas usam igualdade de <em>ordem 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 em vers\u00f5es anteriores\r\n\/\/sampleEnd\r\n}\r\n<\/pre>\n<p>Na vers\u00e3o 1.4-M3 come\u00e7amos o ciclo de depreca\u00e7\u00e3o para as fun\u00e7\u00f5es de extens\u00e3o <code>contains<\/code>, <code>indexOf<\/code> e <code>lastIndexOf<\/code> de <code>FloatArray<\/code> e <code>DoubleArray<\/code>. Ao tentar utiliz\u00e1-las, voc\u00ea receber\u00e1 avisos com instru\u00e7\u00f5es para substituir os usos dessas fun\u00e7\u00f5es.<br \/>\nEm lan\u00e7amentos futuros aumentaremos o n\u00edvel de depreca\u00e7\u00e3o para <code>ERROR<\/code> e removeremos essas fun\u00e7\u00f5es da API p\u00fablica.<\/p>\n<h2 id=\"converting-from-ktype-to-java-type\">Convers\u00e3o de KType para Java Type<\/h2>\n<p>No Kotlin 1.3.40 <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/06\/kotlin-1-3-40-released\/#type-of\">acrescentamos uma pr\u00e1tica fun\u00e7\u00e3o <code>typeOf<\/code><\/a> \u00e0 biblioteca padr\u00e3o. Esta fun\u00e7\u00e3o retorna uma representa\u00e7\u00e3o em tempo de execu\u00e7\u00e3o do tipo reificado <code>T<\/code> como inst\u00e2ncia de <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.reflect\/-k-type\/\" target=\"_blank\" rel=\"noopener\"><code>KType<\/code><\/a>. Por\u00e9m, em muitos casos de uso pr\u00e1ticos, voc\u00ea precisa trabalhar com objetos <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> da API Java reflection em vez de usar <code>KType<\/code>. J\u00e1 era poss\u00edvel realizar a convers\u00e3o necess\u00e1ria, mas para isto era necess\u00e1rio usar a depend\u00eancia <code>kotlin-reflect<\/code> inteira. Agora atualizamos a biblioteca padr\u00e3o com uma forma de converter um <code>KType<\/code> em um <code>Type<\/code> Java \u2013 uma propriedade de extens\u00e3o <code>KType.javaType<\/code> que retorna um <code>Type<\/code> Java:<\/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>Note que, at\u00e9 o momento, o <code>Type<\/code> Java obtido n\u00e3o se comporta da forma correta em alguns casos especiais (como em par\u00e2metros de tipo anotados ou vari\u00e2ncia no local da declara\u00e7\u00e3o), portanto <code>KType.javaType<\/code> continua experimental. Voc\u00ea pode encontrar mais detalhes sobre os casos n\u00e3o suportados neste <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-32241#focus=streamItem-27-4200156.0-0\" target=\"_blank\" rel=\"noopener\">issue<\/a>.<\/p>\n<h2>Compatibilidade<\/h2>\n<p>Observe que o Kotlin 1.4 n\u00e3o tem compatibilidade retroativa com a vers\u00e3o 1.3 em alguns casos especiais. Todos esses casos foram cuidadosamente revisados pelo comit\u00ea da linguagem e ser\u00e3o listados no &quot;guia de compatibilidade&quot; (semelhante a <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/compatibility-guide-13.html\" target=\"_blank\" rel=\"noopener\">este<\/a>). Por enquanto, voc\u00ea pode encontrar esta lista no <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 de pr\u00e9-lan\u00e7amento<\/h3>\n<blockquote><p>\n  Observe que as garantias de compatibilidade retroativa n\u00e3o abrangem vers\u00f5es de pr\u00e9-lan\u00e7amento. Os recursos e a API poder\u00e3o mudar em lan\u00e7amentos subsequentes. Quando chegarmos a uma RC final, todos os bin\u00e1rios produzidos pelas vers\u00f5es de pr\u00e9-lan\u00e7amento ser\u00e3o proibidos pelo compilador, e voc\u00ea precisar\u00e1 recompilar tudo o que foi compilado pelo 1.4\u2011Mx.\n<\/p><\/blockquote>\n<h2 id=\"how-to-try\">Como experimentar os \u00faltimos recursos<\/h2>\n<p>Como sempre, voc\u00ea pode <strong>experimentar o Kotlin online<\/strong> em <a href=\"http:\/\/play.kotl.in\/\" target=\"_blank\" rel=\"noopener\">play.kotl.in<\/a>.<\/p>\n<p>No <strong>IntelliJ IDEA<\/strong> e <strong>Android Studio<\/strong> voc\u00ea pode atualizar o Kotlin Plugin para a vers\u00e3o 1.4-M3. Veja <a href=\"https:\/\/kotlinlang.org\/eap\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener\">como fazer isso<\/a>.<\/p>\n<p>Se quiser trabalhar em projetos existentes que foram criados antes de instalar a vers\u00e3o de pr\u00e9via, ser\u00e1 necess\u00e1rio <a href=\"https:\/\/kotlinlang.org\/eap\/configure-build-for-eap.html\" target=\"_blank\" rel=\"noopener\">configurar sua compila\u00e7\u00e3o para a vers\u00e3o de pr\u00e9via no Gradle ou Maven<\/a>.<\/p>\n<p>Voc\u00ea pode baixar o <strong>compilador de linha de comando<\/strong> da <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.4-M3\" target=\"_blank\" rel=\"noopener\">p\u00e1gina do lan\u00e7amento no GitHub<\/a>.<\/p>\n<p>Voc\u00ea pode usar as seguintes vers\u00f5es das <strong>bibliotecas<\/strong> publicadas junto com este lan\u00e7amento:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.atomicfu\" target=\"_blank\" rel=\"noopener\">kotlinx.atomicfu<\/a> vers\u00e3o: <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> vers\u00e3o: <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> vers\u00e3o: <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> vers\u00e3o: <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>Os detalhes do lan\u00e7amento e a lista de bibliotecas compat\u00edveis tamb\u00e9m est\u00e3o dispon\u00edveis <a href=\"https:\/\/kotlinlang.org\/eap\/#build-details\" target=\"_blank\" rel=\"noopener\">aqui<\/a>.<\/p>\n<h2 id=\"share-your-feedback\">Compartilhe suas impress\u00f5es<\/h2>\n<p>Somos gratos por todos os relatos de bugs que voc\u00ea enviou para nosso <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener\">rastreador de issues<\/a> e faremos o melhor poss\u00edvel para corrigir todos os issues mais importantes antes do lan\u00e7amento final.<\/p>\n<p>Voc\u00ea tamb\u00e9m est\u00e1 convidado a participar do <em><a href=\"https:\/\/app.slack.com\/client\/T09229ZC6\/C0KLZSCHF\" target=\"_blank\" rel=\"noopener\">canal #eap<\/a><\/em> no nosso <a href=\"https:\/\/app.slack.com\/client\/T09229ZC6\/C0KLZSCHF\" target=\"_blank\" rel=\"noopener\">Kotlin Slack<\/a> (obtenha um convite <a href=\"http:\/\/slack.kotlinlang.org\/\" target=\"_blank\" rel=\"noopener\">aqui<\/a>). Neste canal voc\u00ea pode fazer perguntas, participar de discuss\u00f5es e receber notifica\u00e7\u00f5es dos novos builds de pr\u00e9-visualiza\u00e7\u00e3o.<\/p>\n<p>M\u00e3os \u00e0 obra com o Kotlin!<\/p>\n<h2 id=\"external-contributors\">Contribui\u00e7\u00f5es externas<\/h2>\n<p>Gostar\u00edamos de agradecer a todos os nossos contribuintes externos cujos pull requests foram inclu\u00eddos neste lan\u00e7amento:<\/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":59209,"comment_status":"open","ping_status":"closed","template":"","categories":[826,909,907],"tags":[600,477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/63817"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=63817"}],"version-history":[{"count":0,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/63817\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/59209"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=63817"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=63817"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=63817"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=63817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}