Generics en Kotlin : pourquoi sont-ils nécessaires et comment les utiliser pour les débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction aux Generics en Kotlin

\n\n

Lors du développement en Kotlin, tôt ou tard, vous rencontrerez une situation où le même algorithme ou la même structure de données doit fonctionner avec différents types d'objets. Imaginez que vous écrivez une fonction pour trouver l'élément maximum dans une liste — elle doit traiter aussi bien une liste de nombres qu'une liste de chaînes de caractères. Sans outils spéciaux, vous devriez écrire des implémentations séparées pour chaque type. C'est là que les Generics (génériques ou généralisations) viennent à la rescousse.

\n\n

Les Generics en Kotlin sont un mécanisme puissant qui permet de créer des classes, des fonctions et des interfaces qui fonctionnent avec différents types de données, tout en maintenant une typage strict à la compilation. Dans cet article, nous allons voir pourquoi les Generics sont nécessaires et apprendre à les utiliser avec des exemples pratiques.

\n\n

Que sont les Generics et pourquoi sont-ils nécessaires ?

\n\n

Imaginez une boîte qui peut contenir n'importe quel objet : un livre, un téléphone ou une pomme. En programmation, une telle "boîte" est une classe ou une fonction générique. Sans Generics, vous devriez utiliser le type Any (analogue à Object en Java) et faire constamment des conversions de type, ce qui est source d'erreurs.

\n\n

Problème sans Generics

\n\n
fun <T> printList(list: List<T>) {\n    for (item in list) {\n        println(item)\n    }\n}\n\n// Sans Generics, il faudrait écrire ainsi :\nfun printListAny(list: List<Any>) {\n    for (item in list) {\n        // Il faut vérifier le type et convertir\n        if (item is String) {\n            println("Chaîne : $item")\n        } else if (item is Int) {\n            println("Nombre : $item")\n        }\n    }\n}
\n\n

Avantages de l'utilisation des Generics

\n\n
    \n
  • Sécurité des types — le compilateur vérifie la validité de l'utilisation des types à la compilation.
  • \n
  • Réutilisation du code — une seule fonction ou classe fonctionne avec n'importe quel type.
  • \n
  • Élimination des conversions explicites — le code devient plus propre et moins sujet aux erreurs.
  • \n
  • Performance — pas de surcharge due à la vérification des types à l'exécution.
  • \n
\n\n

Constructions principales des Generics en Kotlin

\n\n

1. Fonctions génériques

\n\n

Une fonction générique est une fonction qui accepte un paramètre de type. Elle se déclare avec des chevrons <T> avant le nom de la fonction.

\n\n
fun <T> getFirstElement(list: List<T>): T? {\n    return list.firstOrNull()\n}\n\nfun main() {\n    val numbers = listOf(1, 2, 3, 4, 5)\n    val firstNumber = getFirstElement(numbers)\n    println("Premier nombre : $firstNumber") // 1\n\n    val words = listOf("Chat", "Chien", "Perroquet")\n    val firstWord = getFirstElement(words)\n    println("Premier mot : $firstWord") // Chat\n}
\n\n

Remarque : le type T est automatiquement déduit par le compilateur. Vous pouvez le spécifier explicitement, mais ce n'est pas obligatoire :

\n\n
val firstNumber = getFirstElement<Int>(numbers)
\n\n

2. Classes génériques

\n\n

Une classe générique est une classe qui peut stocker et traiter des objets de n'importe quel type. Un excellent exemple est la classe standard Box.

\n\n
class Box<T>(private val content: T) {\n    fun getContent(): T {\n        return content\n    }\n\n    fun isTypeOf(typeClass: Class<*>): Boolean {\n        return typeClass.isInstance(content)\n    }\n}\n\nfun main() {\n    val stringBox = Box("Bonjour, le monde !")\n    println(stringBox.getContent()) // Bonjour, le monde !\n\n    val intBox = Box(42)\n    println(intBox.getContent()) // 42\n\n    // Vérification de type\n    println(intBox.isTypeOf(Int::class.java)) // true\n}
\n\n

3. Interfaces génériques

\n\n

Les interfaces peuvent également être génériques. Cela est particulièrement utile lors de la création de collections ou de contrats pour le traitement de données.

\n\n
interface Repository<T> {                

Blogs

Book Recommendations