Looking for java Keywords? Try Ask4Keywords

Java LanguageGénériques


Introduction

Les génériques sont une fonctionnalité de programmation générique qui étend le système de type Java pour permettre à un type ou à une méthode de fonctionner sur des objets de différents types tout en offrant une sécurité de type à la compilation. En particulier, la structure de collections Java prend en charge les génériques pour spécifier le type d'objets stockés dans une instance de collection.

Syntaxe

  • class ArrayList <E> {} // une classe générique avec le paramètre de type E
  • class HashMap <K, V> {} // une classe générique avec deux paramètres de type K et V
  • <E> void print (élément E) {} // une méthode générique avec le paramètre de type E
  • ArrayList <String> noms; // déclaration d'une classe générique
  • ArrayList <?> Objets; // déclaration d'une classe générique avec un paramètre de type inconnu
  • new ArrayList <String> () // instanciation d'une classe générique
  • new ArrayList <> () // instanciation avec inférence de type "diamond" (Java 7 ou ultérieur)

Remarques

Les génériques sont implémentés dans Java through Type Erasure, ce qui signifie que pendant l'exécution, les informations de type spécifiées dans l'instanciation d'une classe générique ne sont pas disponibles. Par exemple, l'instruction List<String> names = new ArrayList<>(); produit un objet liste à partir duquel le type d'élément String ne peut pas être récupéré à l'exécution. Toutefois, si la liste est stockée dans un champ de type List<String> , ou transmise à un paramètre de méthode / constructeur du même type ou renvoyée par une méthode de ce type de retour, les informations de type complètes peuvent être récupérées à l'exécution via l'API Java Reflection.

Cela signifie également que lors de la conversion vers un type générique (par exemple: (List<String>) list ), la distribution est une distribution non contrôlée . Étant donné que le paramètre <String> est effacé, la machine virtuelle Java ne peut pas vérifier si une conversion d'une List<?> Vers une List<String> est correcte. La JVM ne voit un cast que pour List to List à l'exécution.

Génériques Exemples Liés