Gids voor de Diamond Operator in Java

1. Overzicht

In dit artikel zullen we kijken naar de diamantoperator in Java en hoe generieke geneesmiddelen en de Collections API de evolutie ervan beïnvloedden.

2. Ruwe soorten

Vóór Java 1.5 ondersteunde de Collections API alleen onbewerkte typen - er was geen manier om type-argumenten te parametriseren bij het samenstellen van een verzameling:

Lijst auto's = nieuwe ArrayList (); cars.add (nieuw object ()); cars.add ("auto"); cars.add (nieuw geheel getal (1));

Hierdoor kon elk type worden toegevoegd en leidde tot mogelijke castinguitzonderingen tijdens runtime.

3. Generiek

In Java 1.5 werden Generics geïntroduceerd - waardoor we de type-argumenten voor klassen konden parametriseren, inclusief die in de Collections API - bij het declareren en construeren van objecten:

Lijst auto's = nieuwe ArrayList ();

Op dit punt moeten we specificeer het geparametriseerde type in de constructor, wat enigszins onleesbaar kan zijn:

Kaart<>>> auto's = nieuwe HashMap<>>>();

De reden voor deze aanpak is dat onbewerkte typen bestaan ​​nog steeds omwille van achterwaartse compatibiliteit, dus de compiler moet onderscheid maken tussen deze onbewerkte typen en generieke geneesmiddelen:

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

Hoewel de compiler ons nog steeds toestaat om onbewerkte typen in de constructor te gebruiken, zal het ons een waarschuwingsbericht geven:

ArrayList is een onbewerkt type. Verwijzingen naar het generieke type ArrayList moeten worden geparametriseerd

4. Diamantoperator

De diamantoperator - geïntroduceerd in Java 1.7 - voegt type-gevolgtrekking toe en vermindert de breedsprakigheid in de toewijzingen - bij het gebruik van generieke geneesmiddelen:

Lijst auto's = nieuwe ArrayList ();

De type-inferentiefunctie van de Java 1.7-compiler bepaalt de meest geschikte constructor-declaratie die overeenkomt met de aanroep.

Beschouw de volgende interface en klassenhiërarchie voor het werken met voertuigen en motoren:

openbare interface Motor {} openbare klasse Dieselimplementaties Motor {} openbare interface Voertuig {} openbare klasse Auto implementeert Voertuig {}

Laten we een nieuw exemplaar maken van een Auto met behulp van de diamantoperator:

Car myCar = nieuwe auto ();

Intern weet de compiler dat Diesel implementeert het Motor interface en kan vervolgens een geschikte constructor bepalen door het type af te leiden.

5. Conclusie

Simpel gezegd, de diamantoperator voegt de type-inferentiefunctie toe aan de compiler en vermindert de breedsprakigheid in de opdrachten die met generieke geneesmiddelen worden geïntroduceerd.

Enkele voorbeelden van deze tutorial zijn te vinden op het GitHub-project, dus voel je vrij om het te downloaden en ermee te spelen.