{"id":59150,"date":"2020-07-21T09:28:29","date_gmt":"2020-07-21T09:28:29","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=kotlin&#038;p=59150"},"modified":"2020-07-22T06:57:05","modified_gmt":"2020-07-22T06:57:05","slug":"kotlin-1-4-m3-est-disponible-modifications-de-la-bibliotheque-standard","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/fr\/kotlin\/2020\/07\/kotlin-1-4-m3-est-disponible-modifications-de-la-bibliotheque-standard\/","title":{"rendered":"Kotlin 1.4-M3 est disponible\u00a0: modifications de la biblioth\u00e8que standard"},"content":{"rendered":"<p>Kotlin 1.4-M3 est disponible\u00a0: modifications de la biblioth\u00e8que standard<\/p>\n<p>Nous avons le plaisir de vous pr\u00e9senter la derni\u00e8re \u00e9tape de la preview de Kotlin 1.4 : la version <strong>1.4-M3<\/strong>. Dans cet article, nous vous guidons \u00e0 travers les diverses modifications que cette preview apporte \u00e0 la biblioth\u00e8que standard de Kotlin. D&#8217;autres composants font \u00e9galement l&#8217;objet de mises \u00e0 jour dans la version M3, mais nous les aborderons dans un prochain article sur la version release candidate (1.4-RC).<\/p>\n<p><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\" \/><\/p>\n<p>Les modifications de la biblioth\u00e8que standard dans la version 1.4-M3 portent sur les points suivants\u00a0:<\/p>\n<ul>\n<li>Les biblioth\u00e8ques JVM incluent maintenant le descripteur <code>module-info<\/code><\/li>\n<li>\nLes interfaces fonctionnelles<\/a> sont ajout\u00e9s \u00e0 la biblioth\u00e8que standard<\/li>\n<li>\nDe nouvelles op\u00e9rations de collections pour couvrir des cas concrets<\/li>\n<li>\nL&#8217;annotation <code>@Throws<\/code><\/a> dans la biblioth\u00e8que commune<\/li>\n<li>L&#8217;abandon de certaines fonctions sur les tableaux de valeurs en virgule flottante<\/li>\n<\/ul>\n<p>Vous trouverez la liste compl\u00e8te des modifications dans le <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/blob\/1.4-M3\/ChangeLog.md\" target=\"_blank\" rel=\"noopener noreferrer\">journal des modifications<\/a>. Comme toujours, nous sommes extr\u00eamement reconnaissants envers nos contributeurs externes.<\/p>\n<p>Nous comptons sur vous pour essayer la preview et nous faire part de vos retours.<\/p>\n<p><!--plus--><\/p>\n<h2 id=\"module-info\">Les artefacts de la biblioth\u00e8que standard comprennent d\u00e9sormais des descripteurs module-info<\/h2>\n<p>Depuis Java\u00a09, vous pouvez modulariser votre application gr\u00e2ce au projet Jigsaw. L&#8217;<a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/11\/tools\/jlink.html\" target=\"_blank\" rel=\"noopener noreferrer\">outil <strong>jlink<\/strong><\/a> vous permet de g\u00e9n\u00e9rer une image Java runtime personnalis\u00e9e contenant uniquement les modules de la plateforme qui sont n\u00e9cessaires pour votre application. Auparavant, il \u00e9tait possible d&#8217;utiliser <code>jlink<\/code> avec les artefacts de biblioth\u00e8que standard de Kotlin, mais il fallait utiliser des artefacts s\u00e9par\u00e9s (ceux avec le classificateur &quot;modular&quot;) et la configuration n&#8217;\u00e9tait pas simple. L&#8217;impossibilit\u00e9 d&#8217;inclure des descripteurs de modules dans les principaux artefacts \u00e9tait due \u00e0 des probl\u00e8mes li\u00e9s \u00e0 l&#8217;outillage d&#8217;Android, qui sont maintenant r\u00e9solus.<\/p>\n<p>Kotlin 1.4 ajoute les informations du module <code>module-info.java<\/code> aux artefacts de biblioth\u00e8que standard par d\u00e9faut, afin que vous puissiez les utiliser facilement avec <code>jlink<\/code>. Sous Android, veillez \u00e0 utiliser le plugin Android Gradle version 3.2 ou sup\u00e9rieure, qui peut traiter correctement les fichiers jar avec module-info.<\/p>\n<h2 id=\"fun-interfaces-in-stdlib\">fun interfaces dans la biblioth\u00e8que standard<\/h2>\n<p>Kotlin 1.4 prend en charge <a href=\"https:\/\/blog.jetbrains.com\/fr\/2020\/01\/06\/ce-qui-vous-attend-dans-kotlin-1-4-et-ses-versions-ulterieures\/\" target=\"_blank\" rel=\"noopener noreferrer\">les conversions SAM pour les classes Kotlin<\/a>. Vous pouvez marquer une interface ayant une seule m\u00e9thode abstraite comme <code>fun interface<\/code>, puis passer un lambda comme argument lorsque cette interface est attendue comme param\u00e8tre. Dans la biblioth\u00e8que standard, les interfaces suivantes sont d\u00e9sormais d\u00e9clar\u00e9es comme <code>fun interface<\/code>\u00a0:<\/p>\n<ul>\n<li><code>Comparator<\/code><\/li>\n<li><code>ReadOnlyProperty<\/code><\/li>\n<li><code>PropertyDelegateProvider<\/code> (qui a \u00e9t\u00e9 introduit dans la version <a href=\"https:\/\/blog.jetbrains.com\/fr\/2020\/05\/19\/premier-apercu-de-kotlin-1-4-m2-ameliorations-de-la-bibliotheque-standard\/\" target=\"_blank\" rel=\"noopener noreferrer\">1.4-M2<\/a>)<\/li>\n<\/ul>\n<p>Vous pouvez utiliser un constructeur SAM qui prend un lambda comme param\u00e8tre pour cr\u00e9er une instance. Le code qui en r\u00e9sulte est bien plus simple\u00a0:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface-1.png\" data-gif-src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/07\/fun_interface.gif\"><\/p>\n<h2 id=\"collection-operations\">Op\u00e9rations de collections<\/h2>\n<ul>\n<li>Une nouvelle fonction <code>sumOf<\/code> prend une fonction de s\u00e9lecteur et renvoie une somme de ses valeurs sur tous les \u00e9l\u00e9ments d&#8217;une collection. Elle est assez similaire aux fonctions existantes <code>sumBy<\/code> et <code>sumByDouble<\/code>. La principale diff\u00e9rence est que la nouvelle fonction <code>sumOf<\/code> accepte des s\u00e9lecteurs avec diff\u00e9rents types de retour, ce qui permet de traiter les sommes de diff\u00e9rents types de la m\u00eame mani\u00e8re. Plus pr\u00e9cis\u00e9ment, sumOf produit des sommes des types <code>Int<\/code>, <code>Long<\/code>, <code>Double<\/code>, <code>UInt<\/code>, <code>ULong<\/code>. Sur la JVM, <code>BigInteger<\/code> et <code>BigDecimal<\/code> sont \u00e9galement disponibles.\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>\nLes fonctions <code>min<\/code> et <code>max<\/code> ont \u00e9t\u00e9 renomm\u00e9es en <code>minOrNull<\/code> et <code>maxOrNull<\/code>. Depuis leur introduction dans la version 1.0, <code>min<\/code> et <code>max<\/code> ont renvoy\u00e9 <code>null<\/code> pour les collections vides. Ceci est contraire \u00e0 la convention de nommage utilis\u00e9e dans l&#8217;API des collections de Kotlin\u00a0: les fonctions sans le suffixe <code>*OrNull<\/code> l\u00e8vent une exception si la collection r\u00e9ceptrice est vide. Pour obtenir un <code>null<\/code> \u00e0 la place, vous devez utiliser la version <code>*OrNull<\/code> de la fonction, par exemple <code>firstOrNull<\/code>.<br \/>\nNous avons donc d\u00e9cid\u00e9 de modifier progressivement le comportement de <code>min<\/code> et <code>max<\/code>. Dans la version 1.4-M3, nous ajoutons <code>minOrNull<\/code> et <code>maxOrNull<\/code> comme synonymes de <code>min<\/code> et <code>max<\/code> et nous d\u00e9marrons le cycle de r\u00e9vision pour <code>min<\/code> et <code>max<\/code>, en vue de les r\u00e9introduire avec des types de retour non null.\n<\/li>\n<li>\nNous avons introduit les fonctions <code>minOf<\/code> et <code>maxOf<\/code> qui renvoient la valeur minimale ou maximale de la fonction de s\u00e9lecteur donn\u00e9e sur les \u00e9l\u00e9ments de la collection. Ces fonctions apportent une solution \u00e0 la situation dans laquelle il \u00e9tait n\u00e9cessaire d&#8217;\u00e9crire <code>map { selector }.max()!!<\/code> ou <code>maxBy { selector }!!.selector<\/code> (ou <code>min<\/code> et <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>Par souci de coh\u00e9rence avec l&#8217;API existante, nous avons \u00e9galement ajout\u00e9 <code>minOfWith<\/code> et <code>maxOfWith<\/code>, qui prennent un <code>Comparator<\/code> comme argument.<br \/>\nLes quatre nouvelles fonctions suivent la convention non-null que nous avons d\u00e9crite ci-dessus : elles lancent des exceptions sur les collections vides et ont des versions <code>*OrNull<\/code> qui renvoient <code>null<\/code> dans ce cas.\n<\/li>\n<li>\nDe nouvelles surcharges pour <code>flatMap<\/code> et <code>flatMapTo<\/code> vous permettent d&#8217;utiliser des transformations avec des types de retour ne correspondant pas au type de r\u00e9cepteur, \u00e0 savoir\u00a0:<\/p>\n<ul>\n<li>transformations en <code>Sequence<\/code> pour <code>Iterable<\/code>, <code>Array<\/code> et <code>Map<\/code><\/li>\n<li>transformations en <code>Iterable<\/code> pour <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 Une nouvelle fonction <code>flatMapIndexed<\/code> a \u00e9t\u00e9 ajout\u00e9e comme contrepartie de <code>flatMap<\/code>. Comme vous le savez peut-\u00eatre d\u00e9j\u00e0, <code>Indexed<\/code> dans le nom d&#8217;une fonction de traitement de collection signifie que l&#8217;op\u00e9ration appliqu\u00e9e a l&#8217;index de l&#8217;\u00e9l\u00e9ment comme param\u00e8tre.<\/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\">Annotation @Throws commune<\/h2>\n<p>Bien que Kotlin <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/exceptions.html#checked-exceptions\" target=\"_blank\" rel=\"noopener noreferrer\">n&#8217;ait pas d&#8217;exceptions v\u00e9rifi\u00e9es<\/a>, il utilise <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.jvm\/-throws\/\" target=\"_blank\" rel=\"noopener noreferrer\">l&#8217;annotation <a href=\"mailto:code&gt;@Throws&lt;\/code\">code>@Throws<\/code<\/a><\/a> pour assurer l&#8217;interop\u00e9rabilit\u00e9 avec les langages qui en ont, tels que Java et Swift. Auparavant, il y avait des annotations distinctes avec ce nom pour JVM (<code>kotlin.jvm.Throws<\/code>) et Native (<code>kotlin.native.Throws<\/code>). \u00c0 partir de la version 1.4-M3, l&#8217;annotation <code> @Throws<\/code> est disponible dans la biblioth\u00e8que commune directement au sein du package <code>kotlin<\/code> (<code>kotlin.Throws<\/code>), ce qui vous permet de l&#8217;utiliser dans le code commun.<\/p>\n<h3 id=\"throws-in suspending-functions-in-swift-and-objective-c\"> @Throws dans les fonctions de suspension pour Swift et Objective-C<\/h3>\n<p>Dans la version1.4-M1, nous avions annonc\u00e9 des <a href=\"https:\/\/blog.jetbrains.com\/fr\/2020\/04\/02\/publication-de-kotlin-1-4-m1\/\" target=\"_blank\" rel=\"noopener noreferrer\">changements relatifs au traitement des exceptions dans l&#8217;interop Objective-C\/Swift<\/a>\u00a0: d\u00e9sormais, <code>NSError<\/code> n&#8217;est lanc\u00e9 que pour les exceptions qui sont des instances de classes sp\u00e9cifi\u00e9es comme param\u00e8tres de l&#8217;annotation <code> @Throws<\/code> (ou leurs sous-classes). Dans la 1.4-M2, nous avons introduit une <a href=\"https:\/\/blog.jetbrains.com\/fr\/2020\/06\/11\/publication-de-kotlin-1-4-m2\/\" target=\"_blank\" rel=\"noopener noreferrer\">prise en charge basique des fonctions de suspension de Kotlin pour Swift et Objective-C<\/a>. Avec la version 1.4-M3, il y a quelques changements dans le comportement des fonctions de suspension annot\u00e9es avec <code> @Throws<\/code>\u00a0:<\/p>\n<ul>\n<li>Si vous avez un <code>suspend fun<\/code> annot\u00e9 avec <code> @Throws<\/code>, vous devez sp\u00e9cifier <code>CancellationException::class<\/code> comme param\u00e8tre de l&#8217;annotation <code> @Throws<\/code>. Sinon, vous obtiendrez une erreur de compilation.<\/li>\n<li>S&#8217;il n&#8217;y a pas d&#8217;annotation <code>@Throws<\/code> sur un <code>suspend fun<\/code>, il utilisera implicitement <code> @Throws(CancellationException::class)<\/code> lorsque vous l&#8217;appellez depuis Swift.<\/li>\n<\/ul>\n<h2 id=\"equality-in-floating-point-arrays\">\u00c9galit\u00e9 dans les tableaux de valeurs \u00e0 virgule flottante<\/h2>\n<p>Beaucoup d&#8217;entre vous connaissent ces fonctions d&#8217;extension pratiques pour les types de conteneurs\u00a0: <code>contains<\/code>, <code>indexOf<\/code>, et <code>lastIndexOf<\/code>. Il y a quelque temps, nous avons d\u00e9couvert que leur comportement sur les tableaux \u00e0 virgule flottante (<code>FloatArray<\/code> et <code>DoubleArray<\/code>) peut \u00eatre discutable et sembler incorrect.<br \/>\nEn effet, ils utilisent la norme <a href=\"https:\/\/en.wikipedia.org\/wiki\/IEEE_754\" target=\"_blank\" rel=\"noopener noreferrer\">IEEE 754<\/a> pour l&#8217;arithm\u00e9tique en virgule flottante. Cette norme d\u00e9finit les r\u00e8gles d&#8217;\u00e9galit\u00e9 suivantes pour les cas particuliers\u00a0:<\/p>\n<ul>\n<li><code>NaN<\/code> <strong>n&#8217;est pas \u00e9gal \u00e0<\/strong> <code>NaN<\/code><\/li>\n<li><code>-0.0<\/code> <strong>est \u00e9gal \u00e0<\/strong> <code>0.0<\/code><\/li>\n<\/ul>\n<p>Ces r\u00e8gles peuvent entra\u00eener des r\u00e9sultats inattendus, par exemple\u00a0:<\/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>De plus, un tel comportement n&#8217;est pas coh\u00e9rent avec la fa\u00e7on dont ces m\u00eames fonctions op\u00e8rent sur les listes, car elles utilisent l&#8217;\u00e9galit\u00e9 <em> ordre 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 dans les versions pr\u00e9c\u00e9dentes\r\n\/\/sampleEnd\r\n}\r\n<\/pre>\n<p>Dans la version 1.4-M3, nous commen\u00e7ons le cycle de r\u00e9vision des fonctions d&#8217;extension <code>contains<\/code>, <code>indexOf<\/code> et <code>lastIndexOf<\/code> de <code>FloatArray<\/code> et <code>DoubleArray<\/code>. Lorsque vous essayerez de les utiliser, vous verrez des avertissements avec des instructions pour le remplacement des utilisations de ces fonctions.<br \/>\nDans les prochaines versions, nous allons relever le niveau de d\u00e9pr\u00e9ciation \u00e0 <code>ERROR<\/code> et supprimer ces fonctions de l&#8217;API publique.<\/p>\n<h2 id=\"converting-from-ktype-to-java-type\">Conversion de KType en Java Type<\/h2>\n<p>Dans Kotlin 1.3.40, nous avons <a href=\"https:\/\/blog.jetbrains.com\/kotlin\/2019\/06\/kotlin-1-3-40-released\/#type-of\" target=\"_blank\" rel=\"noopener noreferrer\">ajout\u00e9 une fonction <code>typeOf<\/code><\/a> \u00e0 la biblioth\u00e8que standard. Cette fonction renvoie une repr\u00e9sentation d&#8217;ex\u00e9cution du type r\u00e9ifi\u00e9 donn\u00e9 <code>T<\/code> comme une instance de <a href=\"https:\/\/kotlinlang.org\/api\/latest\/jvm\/stdlib\/kotlin.reflect\/-k-type\/\" target=\"_blank\" rel=\"noopener noreferrer\"><code>KType<\/code><\/a>. Cependant, dans de nombreux cas d&#8217;utilisation concrets, vous devez travailler avec les objets <a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/api\/java\/lang\/reflect\/Type.html\" target=\"_blank\" rel=\"noopener noreferrer\"><code>java.lang.reflect.Type<\/code><\/a> de Java reflection plut\u00f4t qu&#8217;avec <code>KType<\/code>. Il \u00e9tait d\u00e9j\u00e0 possible d&#8217;effectuer la conversion n\u00e9cessaire, mais il fallait utiliser toute la d\u00e9pendance <code>kotlin-reflect<\/code>. Nous avons maintenant mis \u00e0 jour la biblioth\u00e8que standard avec un moyen de convertir <code>KType<\/code> en <code>Type<\/code> Java \u2013 une propri\u00e9t\u00e9 d&#8217;extension <code>KType.javaType<\/code> qui renvoie un <code>Type<\/code> Java\u00a0:<\/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>Notez que jusqu&#8217;\u00e0 pr\u00e9sent, le <code>Type<\/code> Java obtenu ne se comporte pas correctement dans certains cas particuliers (comme les param\u00e8tres de type annot\u00e9s ou la variance declaration-site), donc <code>KType.javaType<\/code> reste exp\u00e9rimental. Vous pouvez trouver plus de d\u00e9tails sur les cas non pris en charge dans ce <a href=\"https:\/\/youtrack.jetbrains.com\/issue\/KT-32241#focus=streamItem-27-4200156.0-0\" target=\"_blank\" rel=\"noopener noreferrer\">ticket<\/a>.<\/p>\n<h2>Compatibilit\u00e9<\/h2>\n<p>Notez que Kotlin 1.4 n&#8217;est pas r\u00e9trocompatible avec la version 1.3 dans certains cas particuliers. Tous ces cas ont \u00e9t\u00e9 soigneusement examin\u00e9s par le comit\u00e9 du langage et seront r\u00e9pertori\u00e9s dans le &quot;guide de compatibilit\u00e9&quot; (similaire \u00e0 <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/compatibility-guide-13.html\" target=\"_blank\" rel=\"noopener noreferrer\">celui-ci<\/a>). Pour le moment, vous pouvez trouver cette liste dans <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 noreferrer\">YouTrack<\/a>.<\/p>\n<h3>Notes de pr\u00e9-version<\/h3>\n<blockquote><p>\n  Notez que les garanties de r\u00e9trocompatibilit\u00e9 ne concernent pas les versions pr\u00e9liminaires. Les fonctionnalit\u00e9s et l&#8217;API peuvent changer dans les versions ult\u00e9rieures. Lorsque nous arriverons au release candidate final, tous les binaires produits par les versions pr\u00e9liminaires seront interdits par le compilateur et vous devrez recompiler tout ce qui a \u00e9t\u00e9 compil\u00e9 par la version 1.4 \u2011 Mx.\n<\/p><\/blockquote>\n<h2 id=\"how-to-try\">Comment essayer les derni\u00e8res fonctionnalit\u00e9s<\/h2>\n<p>Comme toujours, vous pouvez <strong>essayer Kotlin en ligne<\/strong> sur <a href=\"http:\/\/play.kotl.in\/\" target=\"_blank\" rel=\"noopener noreferrer\">play.kotl.in<\/a>.<\/p>\n<p>Dans <strong>IntelliJ IDEA<\/strong> et <strong>Android Studio<\/strong>, vous pouvez mettre \u00e0 jour le plugin Kotlin vers la version 1.4-M3. Voir <a href=\"https:\/\/kotlinlang.org\/eap\/install-eap-plugin.html\" target=\"_blank\" rel=\"noopener noreferrer\">comment proc\u00e9der<\/a>.<\/p>\n<p>Si vous souhaitez travailler sur des projets existants qui ont \u00e9t\u00e9 cr\u00e9\u00e9s avant d&#8217;installer la version pr\u00e9liminaire, vous devez <a href=\"https:\/\/kotlinlang.org\/eap\/configure-build-for-eap.html\" target=\"_blank\" rel=\"noopener noreferrer\">configurer votre build pour la version Prewiew dans Gradle ou Maven<\/a>.<\/p>\n<p>Vous pouvez t\u00e9l\u00e9charger <strong>le compilateur de ligne de commande<\/strong> sur la <a href=\"https:\/\/github.com\/JetBrains\/kotlin\/releases\/tag\/v1.4-M3\" target=\"_blank\" rel=\"noopener noreferrer\">page Github de la version 1.4-M3<\/a>.<\/p>\n<p>Vous pouvez utiliser les versions suivantes des <strong>biblioth\u00e8ques<\/strong> publi\u00e9es avec cette version\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.atomicfu\" target=\"_blank\" rel=\"noopener noreferrer\">kotlinx.atomicfu<\/a> version\u00a0: <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.atomicfu\/0.14.3-1.4-M3\" target=\"_blank\" rel=\"noopener noreferrer\">0.14.3-1.4-M3<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Kotlin\/kotlinx.coroutines\" target=\"_blank\" rel=\"noopener noreferrer\">kotlinx.coroutines<\/a> version\u00a0: <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 noreferrer\">kotlinx.serialization<\/a> version\u00a0: <a href=\"https:\/\/bintray.com\/kotlin\/kotlinx\/kotlinx.serialization.runtime\/0.20.0-1.4-M3\" target=\"_blank\" rel=\"noopener noreferrer\">0.20.0-1.4-M3<\/a><\/li>\n<li><a href=\"https:\/\/ktor.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">ktor<\/a> version\u00a0: <a href=\"https:\/\/bintray.com\/kotlin\/ktor\/ktor\/1.3.2-1.4-M3\" target=\"_blank\" rel=\"noopener noreferrer\">1.3.2-1.4-M3<\/a><\/li>\n<\/ul>\n<p>Les d\u00e9tails de la version et la liste des biblioth\u00e8ques compatibles sont \u00e9galement disponibles <a href=\"https:\/\/kotlinlang.org\/eap\/#build-details\" target=\"_blank\" rel=\"noopener noreferrer\">ici<\/a>.<\/p>\n<h2 id=\"share-your-feedback\">Partager votre avis<\/h2>\n<p>Nous vous remercions pour tous vos rapports de bugs dans notre <a href=\"https:\/\/youtrack.jetbrains.com\/issues\/KT\" target=\"_blank\" rel=\"noopener noreferrer\">outil de suivi<\/a> et ferons de notre mieux pour corriger tous les probl\u00e8mes les plus importants avant la version finale.<\/p>\n<p>Nous vous invitons \u00e0 rejoindre le <em><a href=\"https:\/\/app.slack.com\/client\/T09229ZC6\/C0KLZSCHF\" target=\"_blank\" rel=\"noopener noreferrer\">canal #eap<\/a><\/em> sur notre <a href=\"https:\/\/app.slack.com\/client\/T09229ZC6\/C0KLZSCHF\" target=\"_blank\" rel=\"noopener noreferrer\">Slack Kotlin<\/a> (demandez une invitation <a href=\"http:\/\/slack.kotlinlang.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ici<\/a>). Sur ce canal, vous pouvez poser vos questions, participer aux discussions et recevoir es notifications sur les nouveaux builds.<\/p>\n<p>Faison \u00e9voluer Kotlin ensemble !<\/p>\n<h2 id=\"external-contributors\">Contributions externes<\/h2>\n<p>Nous remercions tous nos contributeurs externes dont les requ\u00eates pull ont \u00e9t\u00e9 incluses dans cette version\u00a0:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/t-kameyama\" target=\"_blank\" rel=\"noopener noreferrer\">Toshiaki Kameyama<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/sfs\" target=\"_blank\" rel=\"noopener noreferrer\">Steven Sch\u00e4fer<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jsjeon\" target=\"_blank\" rel=\"noopener noreferrer\">Jinseong Jeon<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/pyos\" target=\"_blank\" rel=\"noopener noreferrer\">pyos<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/punzki\" target=\"_blank\" rel=\"noopener noreferrer\">Mark Punzalan<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/rapturemain\" target=\"_blank\" rel=\"noopener noreferrer\">rapturemain<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/tihonovcore\" target=\"_blank\" rel=\"noopener noreferrer\">Vitaly Tihonov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/madsager\" target=\"_blank\" rel=\"noopener noreferrer\">Mads Ager<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/subroh0508\" target=\"_blank\" rel=\"noopener noreferrer\">Subroh Nishikori<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/juan-chen\" target=\"_blank\" rel=\"noopener noreferrer\">Juan Chen<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/gcx11\" target=\"_blank\" rel=\"noopener noreferrer\">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 noreferrer\">Nick<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Dmitry-Borodin\" target=\"_blank\" rel=\"noopener noreferrer\">Dmitry Borodin<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/efemoney\" target=\"_blank\" rel=\"noopener noreferrer\">Efeturi Money<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kevinmost\" target=\"_blank\" rel=\"noopener noreferrer\">Kevin Most<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/anstkras\" target=\"_blank\" rel=\"noopener noreferrer\">Anastasiya Krasnoryadtseva<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kandersen\" target=\"_blank\" rel=\"noopener noreferrer\">Kristoffer Andersen<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mpetrov\" target=\"_blank\" rel=\"noopener noreferrer\">Martin Petrov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/gharrma\" target=\"_blank\" rel=\"noopener noreferrer\">Matthew Gharrity<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mikesamuel\" target=\"_blank\" rel=\"noopener noreferrer\">Mike Samuel<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/McCreeMainer\" target=\"_blank\" rel=\"noopener noreferrer\">Mikhail Likholetov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/segunfamisa\" target=\"_blank\" rel=\"noopener noreferrer\">Segun Famisa<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/kozaxinan\" target=\"_blank\" rel=\"noopener noreferrer\">Sinan Kozak<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/vadimsemenov\" target=\"_blank\" rel=\"noopener noreferrer\">Vadim Semenov<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/valery1707\" target=\"_blank\" rel=\"noopener noreferrer\">Valeriy Vyrva<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/turansky\" target=\"_blank\" rel=\"noopener noreferrer\">Victor Turansky<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/Monchi\" target=\"_blank\" rel=\"noopener noreferrer\">Yuku Kotani<\/a><\/li>\n<\/ul>\n<p><em>Auteur de l&#8217;article original en anglais : <a href=\"https:\/\/blog.jetbrains.com\/author\/pavel-semyonovjetbrains-com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Pavel Semyonov<\/a><\/em><\/p>\n","protected":false},"author":813,"featured_media":59203,"comment_status":"open","ping_status":"closed","template":"","categories":[4113],"tags":[477],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/59150"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=59150"}],"version-history":[{"count":1,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/59150\/revisions"}],"predecessor-version":[{"id":59214,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/kotlin\/59150\/revisions\/59214"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/59203"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=59150"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=59150"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=59150"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=59150"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}