Anleitung zum Diamond Operator in Java

1. Übersicht

In diesem Artikel werden wir uns den Diamantoperator in Java ansehen und wie Generika und die Sammlungs-API seine Entwicklung beeinflusst haben .

2. Rohtypen

Vor Java 1.5 unterstützte die Collections-API nur Rohtypen. Beim Erstellen einer Sammlung konnten Typargumente nicht parametrisiert werden:

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 und führte zur Laufzeit zu möglichen Casting-Ausnahmen .

3. Generika

In Java 1.5 wurden Generics eingeführt, mit denen wir die Typargumente für Klassen , einschließlich der Argumente in der Collections-API , parametrisieren konnten , wenn Objekte deklariert und erstellt wurden:

List cars = new ArrayList();

An dieser Stelle müssen wir den parametrisierten Typ im Konstruktor angeben , der etwas unlesbar sein kann:

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

Der Grund für diesen Ansatz ist, dass aus Gründen der Abwärtskompatibilität immer noch Rohtypen vorhanden sind. 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. Diamantoperator

Der in Java 1.7 eingeführte Diamantoperator fügt Typinferenz hinzu und reduziert die Ausführlichkeit in den Zuweisungen - bei Verwendung von Generika :

List cars = new ArrayList();

Die Typinferenzfunktion des Java 1.7-Compilers bestimmt die am besten geeignete Konstruktordeklaration, die dem Aufruf entspricht .

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 eines Autos mit dem Diamantoperator:

Car myCar = new Car();

Intern weiß der Compiler, dass Diesel die Motorschnittstelle implementiert, und kann dann durch Ableiten des Typs einen geeigneten Konstruktor ermitteln.

5. Schlussfolgerung

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

Einige Beispiele für dieses Tutorial finden Sie im GitHub-Projekt. Laden Sie es herunter und spielen Sie damit.