Java Generics -esimerkkiopas – yleinen menetelmä, luokka, käyttöliittymä
Java Genrics on yksi Java 5: n tärkeimmistä ominaisuuksista.
Jos olet työskennellyt Java-kokoelmien parissa ja versiolla 5 tai uudemmalla, olen varma, että olet käyttänyt sitä.
Java-yleiskokoelmat, joissa on kokoeluluokat, on erittäin helppoa, mutta tarjoaa paljon enemmän ominaisuuksia kuin vain luoda tyypin kokoelma.
Yritämme oppia tämän artikkelin geneeristen ominaisuuksien ominaisuudet. Geneeristen tietojen ymmärtäminen voi joskus olla hämmentävää, jos käytämme ammattikieltä, joten yritän pitää sen yksinkertaisena ja helposti ymmärrettävänä.
Java-generiikat
Yleiset lisättiin Java 5: een, jotta käännösajan tyyppitarkistus ja ClassCastException
-riskin poistaminen olisi yleistä työskennellessä. keräysluokkien kanssa. Koko kokoelmakehys kirjoitettiin uudelleen käyttämään geneerisiä aineita tyyppiturvallisuuteen. Katsotaanpa, kuinka geneeriset aineet auttavat meitä käyttämään kokoeluluokkia turvallisesti.
Yllä oleva koodi kääntyy hienosti, mutta heittää ClassCastExceptionin ajon aikana, koska yritämme lähettää luettelossa olevan objektin merkkijonoksi, kun taas yksi elementistä on tyyppiä Integer. Java 5: n jälkeen käytämme kokoelmaluokkia, kuten alla.
Huomaa, että luettelon luomisen yhteydessä olemme määrittäneet, että luettelon elementtien tyyppi on merkkijono. Joten jos yritämme lisätä minkä tahansa muun tyyppisen objektin luetteloon, ohjelma heittää kääntöaikavirheen. Huomaa myös, että silmukan osalta emme tarvitse luettelon elementin tyypin määritystä, joten poistamme ClassCastException suorituksen aikana.
Java Generic Class
Voimme määritellä omat luokkamme geneeristen tuotteiden kanssa. Geneerinen tyyppi on luokka tai käyttöliittymä, joka parametroidaan tyyppien yli. Käytämme kulmasulkeita (< >) tyypin parametrin määrittämiseksi.
Jotta ymmärrettäisiin etu, sanotaan meillä on yksinkertainen luokka:
Huomaa, että kun käytämme tätä luokkaa, meidän on käytettävä tyyppivalua ja se voi tuottaa ClassCastExceptionin ajon aikana. Nyt käytämme java geneeristä luokkaa kirjoittamaan sama luokka alla olevan kuvan mukaisesti.
Huomaa GenericsType-luokan käyttö päämenetelmässä. Meidän ei tarvitse tehdä tyyppivalua ja voimme poistaa ClassCastExceptionin suorituksen aikana. Jos emme anna tyyppiä luontihetkellä, kääntäjä tuottaa varoituksen, että ”GenericsType on raaka tyyppi.
Viittaukset yleiseen tyyppiin GenericsType < T > tulisi parametroida. ”Kun emme anna tyyppiä, tyypistä tulee Object
, joten se sallii molemmat merkkijonot ja kokonaislukuobjektit. Mutta meidän on aina yritettävä välttää tämä, koska joudumme käyttämään tyyppivalua työskennellessämme raakatyypillä, joka voi tuottaa ajonaikaisia virheitä.
@SuppressWarnings("rawtypes")
-merkintä kääntäjän varoituksen estämiseksi, tutustu java-huomautusten opetusohjelmaan. Huomaa myös, että se tukee java-autoboxingia.
Java-yleinen käyttöliittymä
Vertailukelpoinen käyttöliittymä on hieno esimerkki käyttöliittymien generiikoista, ja se on kirjoitettu seuraavasti:
Vastaavalla tavalla voimme luoda yleisiä käyttöliittymiä javaan. on useita tyypin parametreja kuten Map-käyttöliittymässä voitto voi antaa parametrisoidun arvon myös parametrisoidulle tyypille, esimerkiksi new HashMap<String, List<String>>();
on kelvollinen.
Java-yleistyyppi
Java-yleistyyppien nimeäminen käytäntö auttaa meitä ymmärtämään koodia helposti, ja nimeämiskäytäntö on yksi Java-ohjelmointikielen parhaista käytännöistä. Joten geneerisillä tuotteilla on myös omat nimityskäytäntönsä. Yleensä tyyppiparametrien nimet ovat yksittäisiä isoja kirjaimia, jotta se voidaan helposti erottaa Java-muuttujista. Yleisimmin käytetyt tyyppiparametrien nimet ovat:
- E – Elementti (käytetään laajasti Java Collections Frameworkissa, esimerkiksi ArrayList, Set jne.)
- K – Key ( Käytetään kartassa)
- N – Numero
- T – tyyppi
- V – Arvo (käytetään kartassa)
- S, U, V jne. – 2., 3., 4. tyyppi
Java Generic Method
Joskus emme halua koko luokan parametrointia, tällöin voimme luoda java generics -menetelmä. Koska konstruktori on erityinen menetelmä, voimme käyttää generiikkatyyppiä myös konstruktoreissa.
Tässä on luokka, joka näyttää esimerkin java-yleisestä menetelmästä.
Huomaa isEqual-menetelmä allekirjoitus, joka näyttää syntaksin käyttämään geneeristen tiedostojen tyyppiä menetelmissä. Huomaa myös, kuinka näitä menetelmiä käytetään java-ohjelmassa. Voimme määrittää tyypin kutsumalla näitä menetelmiä tai voimme kutsua niitä tavalliseen tapaan. Java-kääntäjä on tarpeeksi älykäs määrittämään käytetyn muuttujan tyypin. Tätä ominaisuutta kutsutaan tyypin päättelyksi.
Java Generics Bounded Type -parametrit
Oletetaan, että haluamme rajoittaa objektien tyyppiä, jota voidaan käyttää parametrisoidussa tyypissä, esimerkiksi menetelmässä, joka vertaa kahta objektia, ja haluamme varmista, että hyväksytyt objektit ovat vertailukelpoisia. Rajoitetun tyypin parametrin julistamiseksi luetteloi tyypin parametrin nimi, jota seuraa laajennettu avainsana, jota seuraa sen yläraja, kuten alla olevassa menetelmässä.
näiden menetelmien kutsuminen on samanlainen kuin rajoittamaton menetelmä, paitsi että jos yritämme käyttää luokkaa, joka ei ole vertailukelpoinen, se heittää kääntöaikavirheen.
Rajoitettuja tyypin parametreja voidaan käyttää sekä menetelmien että luokat ja rajapinnat.
Java Generics tukee myös useita rajoja, ts. < T laajentaa A & B & C >. Tässä tapauksessa A voi olla käyttöliittymä tai luokka. Jos A on luokka, niin B: n ja C: n tulisi olla liitäntä. Meillä voi olla vain yksi luokka useilla rajoilla.
Java Generics and Inheritance
Tiedämme sen Java-perintö antaa meidän määrittää muuttujan A toiselle muuttujalle B, jos A on B: n alaluokka. Joten voimme ajatella, että mikä tahansa yleinen A-tyyppi voidaan osoittaa yleiseen B-tyyppiin, mutta näin ei ole. Katsotaanpa tämä yksinkertaisen ohjelman avulla.
Emme saa antaa MyClass < String > -muuttujaa MyClassille < Object > muuttuja, koska ne eivät ole yhteydessä toisiinsa, itse asiassa MyClass < T > vanhempi on Object.
Java-yleiset luokat ja alatyyppi
Voimme alatyypin yleisen luokan tai käyttöliittymän laajentamalla tai toteuttamalla sitä. Yhden luokan tai käyttöliittymän tyypin parametrien ja toisen tyypin parametrien välinen suhde määritetään laajennus- ja toteutuslausekkeilla.
Alatyyppisuhde säilyy niin kauan kuin emme muuta tyyppi-argumenttia, alla on esimerkki monentyyppisistä parametreista.
Luettelon < merkkijono voi olla MyList < merkkijono, objekti >, MyList < Merkkijono, kokonaisluku > ja niin edelleen.
Java Generics -merkkijonot
Kysymysmerkki (?) On yleismerkissä yleismerkki ja edustaa tuntematon tyyppi. Jokerimerkkiä voidaan käyttää parametrin, kentän tai paikallisen muuttujan tyypinä ja joskus palautustyyppinä. Emme voi käyttää jokerimerkkejä samalla kun haemme geneeristä menetelmää tai välitämme yleisluokkaa. Seuraavissa osioissa kerrotaan ylärajoitetuista jokerimerkkeistä, alarajoitetuista jokerimerkkeistä ja yleismerkkien sieppauksista.
9.1) Java Generics Upper Bounded Wildcard
Ylärajoitettuja jokerimerkkejä käytetään muuttujan tyypin rajoittaminen menetelmässä. Oletetaan, että haluamme kirjoittaa menetelmän, joka palauttaa luettelon numeroiden summan, joten toteutuksemme on jotain tällaista.
Nyt ongelma yllä oleva toteutus on, että se ei toimi kokonaislukujen tai kaksinkertaisten listojen kanssa, koska tiedämme, että luettelo < kokonaisluku > ja luettelo < Kaksinkertaiset > eivät ole yhteydessä toisiinsa, silloin kun ylemmällä rajalla oleva jokerimerkki on hyödyllinen. Käytämme yleisiä yleismerkkejä laajennetun avainsanan ja ylärajan luokan tai käyttöliittymän kanssa, joiden avulla voimme välittää ylemmän tai sen alaluokkien tyypin argumentin.
Yllä olevaa toteutusta voidaan muokata kuten alla olevaa ohjelmaa. >
Se on samanlainen kuin koodin kirjoittaminen käyttöliittymän suhteen, yllä olevassa menetelmässä voimme käyttää kaikkia ylärajan luokan numero menetelmiä. Huomaa, että ylemmällä rajatulla luettelolla emme saa lisätä luetteloon mitään objekteja paitsi null. Jos yritämme lisätä elementin summa-menetelmän sisällä olevaan luetteloon, ohjelma ei käänny.
9.2) Java Genericsin rajoittamaton jokerimerkki
Joskus meillä on tilanne, jossa Haluamme, että yleinen menetelmä toimii kaikkien tyyppien kanssa, tässä tapauksessa voidaan käyttää rajoittamatonta yleismerkkiä. Se on sama kuin <? laajentaa objektia >.
Voimme tarjota luettelon < Merkkijono > tai Lista < Kokonaisluku > tai minkä tahansa muun tyyppisen objektiluettelon argumentti printData-menetelmä. Kuten ylärajaluettelossa, emme saa lisätä mitään luetteloon.
9.3) Java Genericsin alarajoitettu jokerimerkki
Oletetaan, että haluamme lisätä kokonaisluvut menetelmän kokonaislukujen luetteloon, voimme pitää argumenttityypin luettelona < kokonaisluku >, mutta se sidotaan kokonaislukuihin, kun taas luettelo < Numero > ja Lista < Objekti > voi pitää sisällään myös kokonaislukuja, joten voimme käyttää tätä varten alarajaista jokerimerkkiä. Tämän saavuttamiseksi käytämme yleismerkkejä (?) Superavainsanalla ja alaraja-luokassa.
Voimme välittää alemman tai minkä tahansa alarajan supertyypin argumenttina, tässä tapauksessa java-kääntäjä antaa mahdollisuuden lisätä alempaa rajaa sidotut objektityypit luetteloon.
Alatyyppi yleisten jokerien avulla
Java Generics Type Erasure
Yleiset Java lisättiin tarjoamaan tyyppitarkistus kääntöhetkellä, eikä sillä ole käyttöä ajon aikana, joten java-kääntäjä käyttää tyypin poisto-ominaisuutta poistaakseen kaikki yleiset tyyppitarkistuskoodit tavukoodissa ja lisäämällä tarvittaessa tyyppivalun. Tyyppipoisto varmistaa, että parametroiduille tyypeille ei luoda uusia luokkia; näin ollen geneerisillä tuotteilla ei ole ajonaikaisia yleiskustannuksia.
Esimerkiksi, jos meillä on alla olevan kaltainen yleinen luokka;
Java-kääntäjä korvaa rajoitetun tyyppisen parametrin T ensimmäisellä sidotulla käyttöliittymällä, Vertailukelpoinen , kuten alla oleva koodi:
Generics FAQ: t
12.1) Miksi käytämme Genericsia Java-ohjelmassa?
Generics tarjoaa vahvan kääntöajan tyyppitarkistuksen ja vähentää ClassCastException ja nimenomainen esineiden suoratoisto.
12.2) Mikä on T geneerisissä tiedoissa?
Käytämme < T > luoda yleinen luokka, käyttöliittymä ja menetelmä. T korvataan todellisella tyypillä, kun sitä käytetään.
12.3) Kuinka Generics toimii Javassa?
Yleinen koodi varmistaa tyyppiturvallisuuden. Kääntäjä käyttää tyyppihyväksyntää kaikkien tyyppiparametrien poistamiseen kääntämisajankohtana vähentääkseen ylikuormitusta ajon aikana.
Generics in Java – Lisälukemista
Kaikki tämä on java-, java- ja generaattoreille. geneeriset aineet ovat todella laaja aihe, ja niiden ymmärtäminen ja käyttö vaatii paljon aikaa. Tässä kirjoituksessa yritetään antaa geneeristen lääkkeiden perustiedot ja miten voimme käyttää sitä ohjelmamme laajentamiseen tyyppiturvallisuudella.