Leitfaden für den Diamond Operator in Java

Anleitung zum Diamond Operator in Java

1. Überblick

In diesem Artikel werden diediamond operator in Java and how generics and the Collections API influenced its evolution betrachtet.

2. Rohe Arten

Prior to Java 1.5, the Collections API supported only raw types - Es gab keine Möglichkeit, Typargumente beim Erstellen einer Sammlung zu parametrisieren:

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

Dies ermöglichte das Hinzufügen eines beliebigen Typs undled to potential casting exceptions at runtime.

3. Generika

In Java 1.5 wurden Generics eingeführt -which allowed us to parameterize the type arguments for classes, einschließlich der in der Collections-API - beim Deklarieren und Erstellen von Objekten:

List cars = new ArrayList();

Zu diesem Zeitpunkt müssen wirspecify the parameterized type in the constructor, was etwas unlesbar sein kann:

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

Der Grund für diesen Ansatz istraw types still exist for the sake of backward compatibility, daher muss der Compiler zwischen diesen Rohtypen und Generika unterscheiden:

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

Obwohl der Compiler weiterhin die Verwendung von Rohtypen im Konstruktor zulässt, wird eine Warnmeldung angezeigt:

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

4. Diamant-Betreiber

Der in Java eingeführte Diamantoperator 1.7 -adds type inference and reduces the verbosity in the assignments – when using generics:

List cars = new ArrayList<>();

Die Typinferenzfunktiondetermines the most suitable constructor declaration that matches the invocation des Java 1.7-Compilers.

Berücksichtigen Sie die folgende Schnittstellen- und Klassenhierarchie für die Arbeit mit Fahrzeugen und Motoren:

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

Erstellen wir eine neue Instanz vonCar mit dem Diamantoperator:

Car myCar = new Car<>();

Intern weiß der Compiler, dassDiesel dieEngine-Schnittstelle implementiert, und kann dann einen geeigneten Konstruktor durch Ableiten des Typs ermitteln.

5. Fazit

Einfach ausgedrückt, der Diamantoperator fügt dem Compiler das Typinferenz-Feature hinzu und reduziert die Ausführlichkeit der mit Generika eingeführten Zuweisungen.

Einige Beispiele für dieses Tutorial finden Sie unteron the GitHub project. Laden Sie es herunter und spielen Sie damit.