Guide til Diamond Operator i Java
1. Oversikt
I denne artikkelen vil vi se på diamantoperatør i Java og hvordan generikk og Collections API påvirket utviklingen.
2. Rå typer
Før Java 1.5 støttet Collections API bare råtyper - det var ikke mulig å parameterisere typeargumenter når man konstruerte en samling:
Liste biler = ny ArrayList (); cars.add (nytt Objekt ()); cars.add ("bil"); cars.add (nytt heltal (1));
Dette tillot at alle typer ble lagt til og førte til potensielle casting-unntak ved kjøretid.
3. Generiske
I Java 1.5 ble Generics introdusert - som tillot oss å parameterisere typeargumentene for klasser, inkludert de i Collections API - når deklarerer og konstruerer objekter:
Liste biler = ny ArrayList ();
På dette punktet må vi spesifiser den parameteriserte typen i konstruktøren, som kan være noe uleselig:
Kart <>>> biler = nye HashMap <>>>();
Årsaken til denne tilnærmingen er at råtyper eksisterer fremdeles av hensyn til bakoverkompatibilitet, så kompilatoren må skille mellom disse rå typene og generiske stoffene:
Liste generikk = ny ArrayList (); List raws = ny ArrayList ();
Selv om kompilatoren fremdeles tillater oss å bruke rå typer i konstruktøren, vil den be oss om en advarsel:
ArrayList er en rå type. Henvisninger til generisk ArrayList-type bør parametreres
4. Diamantoperatør
Diamantoperatøren - introdusert i Java 1.7 - legger til typeslutning og reduserer ordlighetsgraden i oppgavene - når du bruker generiske legemidler:
Liste biler = ny ArrayList ();
Java 1.7-kompilatorens type inferensfunksjon bestemmer den mest egnede konstruktørerklæringen som samsvarer med påkallingen.
Vurder følgende grensesnitt og klassehierarki for arbeid med biler og motorer:
offentlig grensesnitt motor {} offentlig klasse diesel implementerer motor {} offentlig grensesnitt kjøretøy {} offentlig klasse bil implementerer kjøretøy {}
La oss lage en ny forekomst av en Bil ved hjelp av diamantoperatøren:
Bil myCar = ny bil ();
Internt vet kompilatoren det Diesel implementerer Motor grensesnitt og er da i stand til å bestemme en passende konstruktør ved å utlede typen.
5. Konklusjon
Enkelt sagt, diamantoperatøren legger til komponentens type inferensfunksjon og reduserer ordlighetsgraden i oppgavene introdusert med generiske.
Noen eksempler på denne veiledningen finner du på GitHub-prosjektet, så du er velkommen til å laste den ned og spille med den.