Guide de l'opérateur Diamond en Java

1. Vue d'ensemble

Dans cet article, nous allons examiner l' opérateur diamant en Java et comment les génériques et l'API Collections ont influencé son évolution .

2. Types bruts

Avant Java 1.5, l'API Collections ne prenait en charge que les types bruts - il n'y avait aucun moyen de paramétrer les arguments de type lors de la construction d'une collection:

List cars = new ArrayList(); cars.add(new Object()); cars.add("car"); cars.add(new Integer(1));

Cela a permis à n'importe quel type d'être ajouté et a conduit à des exceptions de diffusion potentielles au moment de l'exécution .

3. Génériques

Dans Java 1.5, les génériques ont été introduits - ce qui nous a permis de paramétrer les arguments de type pour les classes , y compris ceux de l'API Collections - lors de la déclaration et de la construction d'objets:

List cars = new ArrayList();

À ce stade, nous devons spécifier le type paramétré dans le constructeur , qui peut être quelque peu illisible:

Map
    
     >> cars = new HashMap
     
      >>();
     
    

La raison de cette approche est que les types bruts existent toujours pour des raisons de compatibilité descendante , de sorte que le compilateur doit faire la différence entre ces types bruts et génériques:

List generics = new ArrayList(); List raws = new ArrayList();

Même si le compilateur nous permet toujours d'utiliser des types bruts dans le constructeur, il nous affichera un message d'avertissement:

ArrayList is a raw type. References to generic type ArrayList should be parameterized

4. Opérateur diamant

L'opérateur losange - introduit dans Java 1.7 - ajoute l'inférence de type et réduit la verbosité dans les affectations - lors de l'utilisation de génériques :

List cars = new ArrayList();

La fonction d'inférence de type du compilateur Java 1.7 détermine la déclaration de constructeur la plus appropriée qui correspond à l'appel .

Tenez compte de l'interface et de la hiérarchie de classes suivantes pour travailler avec des véhicules et des moteurs:

public interface Engine { } public class Diesel implements Engine { } public interface Vehicle { } public class Car implements Vehicle { }

Créons une nouvelle instance d'une voiture en utilisant l'opérateur diamant:

Car myCar = new Car();

En interne, le compilateur sait que Diesel implémente l' interface Engine et est ensuite capable de déterminer un constructeur approprié en déduisant le type.

5. Conclusion

En termes simples, l'opérateur diamant ajoute la fonction d'inférence de type au compilateur et réduit la verbosité dans les affectations introduites avec les génériques.

Vous trouverez quelques exemples de ce tutoriel sur le projet GitHub, alors n'hésitez pas à le télécharger et à jouer avec.