Generaliseret mål-type inferens i Java

1. Introduktion

Type Inference blev introduceret i Java 5 for at supplere introduktionen af ​​generics og blev væsentligt udvidet i følgende Java-udgivelser, som også kaldes Generalized Target-Type Inference.

I denne vejledning udforsker vi dette koncept med kodeeksempler.

2. Generiske stoffer

Generics gav os mange fordele, såsom øget typesikkerhed, undgåelse af typegodsfejl og generiske algoritmer. Du kan læse mere om generiske stoffer i denne artikel.

Imidlertid indførelsen af generiske stoffer resulterede i nødvendigheden af ​​at skrive kedelpladekode på grund af behovet for at videregive typeparametre. Nogle eksempler er:

Kort mapOfMaps = nyt HashMap(); Liste strList = Collections.emptyList (); Liste intList = Collections.emptyList ();

3. Skriv inferens inden Java 8

For at reducere den unødvendige kodeudvikling, blev Type Inference introduceret til Java, som er processen med automatisk at udlede uspecificerede datatyper af et udtryk baseret på den kontekstuelle information.

Nu kan vi påberåbe os de samme generiske typer og metoder uden at specificere parametertyperne. Compileren udleder automatisk parametertyperne, når det er nødvendigt.

Vi kan se den samme kode ved hjælp af det nye koncept:

Liste strListInferred = Collections.emptyList (); Liste intListInferred = Collections.emptyList (); 

I ovenstående eksempel, baseret på de forventede afkasttyper Liste og Liste, er compileren i stand til at udlede typeparameteren til følgende generiske metode:

offentlig statisk endelig Liste tomListe () 

Som vi kan se, er den resulterende kode kortfattet. Nu kan vi kalde generiske metoder som en almindelig metode, hvis typeparameteren kan udledes.

I Java 5 kunne vi lave Type-inference i specifikke sammenhænge som vist ovenfor.

Java 7 udvidede de sammenhænge, ​​hvor det kunne udføres. Det introducerede diamantoperatøren . Du kan læse mere om diamantoperatøren i denne artikel.

Nu, Vi kan udføre denne operation for generiske klassekonstruktører i en opgavekontekst. Et sådant eksempel er:

Kort mapOfMapsInferred = ny HashMap ();

Her bruger Java Compiler den forventede tildelingstype til at udlede typeparametrene til HashMap konstruktør.

4. Generel inferens med måltype - Java 8

Java 8 udvidede omfanget af Type Inference yderligere. Vi henviser til denne udvidede inferens kapacitet som generaliseret mål-type inferens. Du kan læse de tekniske detaljer her.

Java 8 introducerede også Lambda Expressions. Lambda-udtryk har ikke en eksplicit type. Deres type udledes ved at se på måltypen for konteksten eller situationen. Måltypen for et udtryk er den datatype, som Java Compiler forventer, afhængigt af hvor udtrykket vises.

Java 8 understøtter slutning ved hjælp af Target-Type i en metodekontekst. Når vi påberåber en generisk metode uden eksplicitte typeargumenter, kan kompilatoren se på metodeopkald og tilsvarende metodedeklarationer for at bestemme det typeargument (eller argumenter), der gør påkaldelsen gældende.

Lad os se på en eksempelkode:

statisk liste tilføj (liste liste, Ta, T b) {liste.add (a); list.add (b); returliste } Liste strListGeneralized = tilføj (ny ArrayList (), "abc", "def"); Liste intListGeneralized = tilføj (ny ArrayList (), 1, 2); Liste numListGeneralized = tilføj (ny ArrayList (), 1, 2.0);

I koden, ArrayList giver ikke typen argument udtrykkeligt. Så compileren skal udlede det. For det første ser kompilatoren argumenterne for add-metoden. Derefter ser det på de parametre, der er sendt ved forskellige påkald.

Det udfører slutning om anvendelse analyse for at afgøre, om metoden gælder for disse påkaldelser. Hvis flere metoder er anvendelige på grund af overbelastning, vælger compileren den mest specifikke metode.

Derefter, compileren udfører slutning af påkaldstype analyse for at bestemme typen argumenter.De forventede måltyper anvendes også i denne analyse. Det udleder argumenterne i de tre tilfælde som ArrayList, ArrayList og ArrayList.

Måltypeslutning giver os mulighed for ikke at specificere typer til lambda-ekspressionsparametre:

Liste intList = Arrays.asList (5, 2, 4, 2, 1); Collections.sort (intList, (a, b) -> a.compareTo (b)); Liste strList = Arrays.asList ("Rød", "Blå", "Grøn"); Collections.sort (strList, (a, b) -> a.compareTo (b));

Her er parametrene -en og b ikke har eksplicit definerede typer. Deres typer udledes som Heltal i det første Lambda-udtryk og som Snor i det andet.

5. Konklusion

I denne hurtige artikel gennemgik vi Type Inference, der sammen med generics og Lambda Expression giver os mulighed for at skrive kortfattet Java-kode.

Som sædvanlig kan den fulde kildekode findes på Github.


$config[zx-auto] not found$config[zx-overlay] not found