Általános célcélú következtetések a Java-ban

1. Bemutatkozás

A Type Inference a Java 5-ben került bevezetésre, hogy kiegészítse a generikumok bevezetését, és jelentősen kibővült a következő Java-kiadásokban, amelyet általánosított cél-típusú következtetésnek is neveznek.

Ebben az oktatóanyagban ezt a koncepciót kódmintákkal fedezzük fel.

2. Generikusok

A generikus gyógyszerek számos előnnyel jártak számunkra, például a megnövelt típusú biztonság, a típus-öntési hibák és az általános algoritmusok elkerülése. Ebben a cikkben többet olvashat a generikus gyógyszerekről.

Azonban a bevezetése a generikusok a kazánlap kódjának írását tették szükségessé, a típusparaméterek átadásának szükségessége miatt. Néhány példa:

Térkép mapOfMaps = új HashMap(); StrList = Collections.emptyList () lista; List intList = Collections.emptyList ();

3. Írja le a következtetést a Java 8 előtt

A felesleges kódbevezetés csökkentése érdekében a Type Inference bevezetésre került a Java-ban, amely az a folyamat, amellyel automatikusan levezetjük a kifejezés nem meghatározott adattípusait a kontextus információi alapján.

Most ugyanazokat az általános típusokat és módszereket hívhatjuk meg a paramétertípusok megadása nélkül. A fordító szükség esetén automatikusan megállapítja a paramétertípusokat.

Ugyanezt a kódot láthatjuk az új koncepció használatával:

StrListInferred = Collections.emptyList () lista; List intListInferred = Collections.emptyList (); 

A fenti példában a várható hozamtípusok alapján Lista és Lista, a fordító a következő általános módszerre tudja következtetni a típusparamétert:

public static final Lista emptyList () 

Mint láthatjuk, a kapott kód tömör. Most akkor általános módszereket hívhatunk közönséges módszerként, ha a típusparaméterre lehet következtetni.

A Java 5-ben specifikus kontextusokban végezhetünk Type-Inference-t, a fentiek szerint.

A Java 7 kibővítette azokat a kontextusokat, amelyekben végre lehet hajtani. Bemutatta a gyémántkezelőt . Ebben a cikkben többet olvashat a gyémántkezelőről.

Most, ezt a műveletet általános osztály konstruktorok számára végezhetjük el hozzárendelési kontextusban. Ilyen például:

Térkép mapOfMapsInferred = új HashMap ();

Itt a Java fordító a várható hozzárendelési típust használja arra, hogy a típusparaméterekre következtetjen HashMap konstruktőr.

4. Általános célcélú következtetés - Java 8

A Java 8 tovább bővítette a Type Inference hatókörét. Erre a kibővített következtetési képességre általánosított céltípus-következtetésként hivatkozunk. A műszaki részleteket itt olvashatja el.

A Java 8 bemutatta a Lambda Expressions-t is. A lambda kifejezéseknek nincs kifejezett típusuk. Típusukra a kontextus vagy a helyzet céltípusát tekintve lehet következtetni. A kifejezés céltípusa az az adattípus, amelyre a Java fordító a kifejezés megjelenési helyétől függően számít.

A Java 8 támogatja a Target-Type használatát a metódus környezetében. Amikor egy általános metódust kifejezett típusú argumentumok nélkül hívunk meg, a fordító megnézheti a metódushívást és a megfelelő metódusdeklarációkat annak meghatározása érdekében, hogy milyen típusú argumentum (vagy argumentumok) alkalmazhatók.

Nézzünk meg egy példakódot:

statikus List add (Lista lista, T a, T b) {list.add (a); list.add (b); visszatérési lista; } Lista strListGeneralized = add (új ArrayList (), "abc", "def"); List intListGeneralized = add (new ArrayList (), 1, 2); Lista numListGeneralized = add (új ArrayList (), 1, 2.0);

A kódban Tömb lista nem adja meg kifejezetten a type argumentumot. Tehát a fordítónak arra kell következtetnie. Először a fordító megvizsgálja az add metódus argumentumait. Ezután megvizsgálja a különböző invokációknál átadott paramétereket.

Teljesít invokációs alkalmazhatósági következtetés elemzés annak megállapítására, hogy a módszer alkalmazható-e ezekre az invokációkra. Ha a túlterhelés miatt több módszer is alkalmazható, a fordító a legspecifikusabb módszert választja.

Azután, a fordító elvégzi invokáció típusú következtetés elemzés a típusú érvek meghatározásához.Ebben az elemzésben a várható céltípusokat is felhasználják. A három esetben az érveket úgy vonja le Tömb lista, Tömb lista és Tömb lista.

A céltípus következtetése lehetővé teszi, hogy ne adjunk meg típusokat a lambda kifejezés paramétereihez:

Lista intList = Tömbök.asList (5, 2, 4, 2, 1); Collections.sort (intList, (a, b) -> a.compareTo (b)); StrList = Arrays.asList lista ("Piros", "Kék", "Zöld"); Collections.sort (strList, (a, b) -> a.compareTo (b));

Itt a paraméterek a és b nincsenek kifejezetten meghatározott típusaik. Típusaikat arra következtetik Egész szám az első Lambda kifejezésben és mint Húr a másodikban.

5. Következtetés

Ebben a rövid cikkben áttekintettük a Type Inferenciát, amely az általános és a Lambda Expression mellett lehetővé teszi számunkra, hogy tömör Java kódot írjunk.

Szokás szerint a teljes forráskód megtalálható a Github oldalon.