Zovšeobecnená odvodenie cieľového typu v Jave

1. Úvod

Type Inference bol zavedený v prostredí Java 5 ako doplnok k zavedeniu generík a bol podstatne rozšírený v nasledujúcich vydaniach Java, ktoré sa tiež označujú ako Generalized Target-Type Inference.

V tomto tutoriáli preskúmame tento koncept so vzorkami kódu.

2. Generiká

Generiká nám poskytli mnoho výhod, ako napríklad zvýšenie bezpečnosti typov, vyhýbanie sa chybám pri vkladaní typov a všeobecné algoritmy. Viac o generikách sa dočítate v tomto článku.

Avšak zavedenie generiká viedli k nutnosti písania štandardného kódu z dôvodu potreby zadania parametrov typu. Niektoré príklady:

Mapa mapOfMaps = nová HashMap(); List strList = Collections.emptyList (); Zoznam intList = Collections.emptyList ();

3. Zadajte odvodenie pred jazykom Java 8

Na zníženie zbytočnej výrečnosti kódu bol zavedený Type Inference do Java, ktorý je proces automatického dedukovania nešpecifikovaných dátových typov výrazu na základe kontextových informácií.

Teraz môžeme vyvolať rovnaké generické typy a metódy bez zadania typov parametrov. Kompilátor v prípade potreby automaticky odvodí typy parametrov.

Rovnaký kód môžeme vidieť pomocou nového konceptu:

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

Vo vyššie uvedenom príklade na základe očakávaných typov návratnosti Zoznam a Zoznam, je kompilátor schopný odvodiť parameter typu z tejto všeobecnej metódy:

verejný statický konečný zoznam emptyList () 

Ako vidíme, výsledný kód je stručný. Teraz môžeme nazvať generické metódy ako bežnú metódu, ak je možné odvodiť parameter typu.

V prostredí Java 5 by sme mohli robiť Type-Inference v konkrétnych kontextoch, ako je uvedené vyššie.

Java 7 rozšírila kontexty, v ktorých sa mohla vykonávať. Predstavila operátora diamantov . Viac o prevádzkovateľovi diamantov sa dočítate v tomto článku.

Teraz, túto operáciu môžeme vykonať pre generické generátory triedy v kontexte priradenia. Jedným z takýchto príkladov je:

Mapa mapOfMapsInferred = nový HashMap ();

Tu kompilátor Java používa očakávaný typ priradenia na odvodenie parametrov typu HashMap konštruktér.

4. Zovšeobecnená odvodenie cieľového typu - Java 8

Java 8 ďalej rozšírila rozsah Type Inference. Túto rozšírenú schopnosť odvodzovania označujeme ako odvodenie generalizovaného cieľového typu. Tu si môžete prečítať technické podrobnosti.

Java 8 tiež predstavila výrazy Lambda Expressions. Výrazy lambda nemajú explicitný typ. Ich typ sa odvodzuje pohľadom na cieľový typ kontextu alebo situácie. Cieľový typ výrazu je dátový typ, ktorý kompilátor Java očakáva v závislosti od toho, kde sa výraz objaví.

Java 8 podporuje inferenciu pomocou Target-Type v kontexte metódy. Keď vyvoláme generickú metódu bez explicitných argumentov typu, kompilátor sa môže pozrieť na vyvolanie metódy a zodpovedajúce vyhlásenia metódy, aby určil argument typu (alebo argumenty), vďaka ktorým je vyvolanie použiteľné.

Pozrime sa na ukážkový kód:

statický zoznam Pridať (zoznam, T a, T b) {list.add (a); list.add (b); návratový zoznam; } Zoznam strListGeneralized = add (nový ArrayList (), "abc", "def"); Zoznam intListGeneralized = add (nový ArrayList (), 1, 2); Zoznam numListGeneralized = add (nový ArrayList (), 1, 2,0);

V kóde ArrayList neposkytuje explicitne argument typu. Takže kompilátor to musí odvodiť. Najskôr kompilátor preskúma argumenty metódy add. Potom sa zameriava na parametre odovzdané pri rôznych vyvolaní.

Vykonáva to vyvodenie použiteľnosti vyvolania analýza na určenie, či sa metóda uplatňuje na tieto vyvolania. Ak je z dôvodu preťaženia použiteľných viac metód, kompilátor by vybral najšpecifickejšiu metódu.

Potom, prekladač vykonáva odvodenie typu vyvolania analýza na určenie argumentov typu.Očakávané typy cieľov sa tiež používajú v tejto analýze. Odvodzuje argumenty v troch prípadoch ako ArrayList, ArrayList a ArrayList.

Odvodenie cieľového typu nám umožňuje nešpecifikovať typy parametrov výrazu lambda:

List intList = Arrays.asList (5, 2, 4, 2, 1); Zbierka.sort (intList, (a, b) -> a.compareTo (b)); List strList = Arrays.asList ("červená", "modrá", "zelená"); Zbierky.sort (strList, (a, b) -> a.compareTo (b));

Tu sú parametre a a b nemajú výslovne definované typy. Ich typy sú odvodené ako Celé číslo v prvom výraze lambda a ako String v druhom.

5. Záver

V tomto rýchlom článku sme preštudovali Type Inference, ktorá nám spolu s generikami a Lambda Expression umožňuje písať výstižný kód Java.

Celý zdrojový kód nájdete ako obvykle na serveri Github.


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