Guida al Diamond Operator in Java

1. Panoramica

In questo articolo, vedremo l' operatore diamond in Java e come i generics e l'API Collections hanno influenzato la sua evoluzione .

2. Tipi grezzi

Prima di Java 1.5, l'API Collections supportava solo i tipi non elaborati : non era possibile parametrizzare gli argomenti del tipo durante la costruzione di una raccolta:

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

Ciò ha consentito di aggiungere qualsiasi tipo e ha portato a potenziali eccezioni di casting in fase di esecuzione .

3. Generici

In Java 1.5, sono stati introdotti i Generics, che ci hanno permesso di parametrizzare gli argomenti di tipo per le classi , inclusi quelli nell'API Collections, durante la dichiarazione e la costruzione di oggetti:

List cars = new ArrayList();

A questo punto, dobbiamo specificare il tipo parametrizzato nel costruttore , che può essere alquanto illeggibile:

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

Il motivo di questo approccio è che i tipi non elaborati esistono ancora per motivi di compatibilità con le versioni precedenti , quindi il compilatore deve distinguere tra questi tipi non elaborati e generici:

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

Anche se il compilatore ci consente ancora di utilizzare i tipi grezzi nel costruttore, ci chiederà un messaggio di avviso:

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

4. Operatore Diamond

L'operatore diamante - introdotto in Java 1.7 - aggiunge l'inferenza del tipo e riduce la verbosità negli incarichi - quando si utilizzano generici :

List cars = new ArrayList();

La funzione di inferenza del tipo del compilatore Java 1.7 determina la dichiarazione del costruttore più adatta che corrisponde all'invocazione .

Considera la seguente interfaccia e gerarchia di classi per lavorare con veicoli e motori:

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

Creiamo una nuova istanza di un'auto utilizzando l'operatore diamante:

Car myCar = new Car();

Internamente, il compilatore sa che Diesel implementa l' interfaccia Engine e quindi è in grado di determinare un costruttore adatto deducendone il tipo.

5. conclusione

In poche parole, l'operatore diamond aggiunge la funzionalità di inferenza del tipo al compilatore e riduce la verbosità negli incarichi introdotti con i generici.

Alcuni esempi di questo tutorial possono essere trovati nel progetto GitHub, quindi sentiti libero di scaricarlo e giocarci.