Java Generics: Kuvaus ja menetelmät
Koska hyvin ulkonäkö Java-kieltä on tehtypaljon muutoksia, jotka epäilemättä toivat positiivisia hetkiä sen toimivuudelle. Yksi tällainen merkityksellinen muutos on Java Genericin tai yleistämisen käyttöönotto. Tämä toiminto on tehnyt kielen joustavuuden ja monipuolisuuden lisäksi myös paljon turvallisemmaksi tietotyyppien vähentämisen kannalta.
Tosiasia on, että ennen yleisten geneeristen lääkkeiden käyttöönottoaJava-koodia voidaan luoda vain objektityypin perusteella. Tällaiset linkit voidaan osoittaa mille tahansa objektille. Loppujen lopuksi kaikki Java-luokat ovat Objekti-luokan implisiittisiä jälkeläisiä. Tämä lähestymistapa on kuitenkin monien tyyppisten turvahäiriöiden mahdollinen lähde, kun objekti on nimenomai- sesti muunnettu kohdetyypiksi. Kun yleistystapoja käytetään, kaikki valokuvat suoritetaan implisiittisesti ja automaattisesti, mikä sulkee pois mahdollisen virheen mahdollisen esiintymisen.
Java Generics: kuvaus ja esimerkki
Otetaan yksinkertainen esimerkki yleistymisen soveltamisesta tavalliseen luokkaan alla olevassa kuvassa. Ja vasta silloin jatkamme yksityiskohtaista tutkimusta Java Genericin kaikkiin hienoisuuksiin ja vivahteisiin.
Huomaa, mitenPariluokkailmoitus. Luokan nimen jälkeen avautuvat kulmakannattimet, joissa on kirjain T. Se on eräänlainen paikkamerkki, joka korvataan tiettyä tyyppiä luotaessa tämän luokan esiintymää. Se näyttää tältä: Pari <kokonaisluku> obj = uusi pari <kokonaisluku> (). Huomaa, että T: n sijasta voit määrittää minkä tahansa kirjeen, mutta käytä T, V tai E yleensä.
Huomautus: alkaen kahdeksannesta Java-versiosta, määrittämällä kohdetyyppi, kun linkki on ilmoitettu, voit jättää kulmanulkimet konstruktorissa tyhjäksi. Joten edellä oleva esimerkki voidaan kirjoittaa uudelleen seuraavasti: Pair <kokonaisluku> obj = uusi pari <> ().
Kun luokka julistetaan tällä tavalla, niin sen luokassaVoit käyttää tätä kirjainta tiettyjen kenttätyyppien, viitteiden ja menetelmien palauttamisen sijaan. Koska T korvataan tietyntyyppisellä luokkaobjektilla, tässä tapauksessa ensimmäinen ja toinen kentti ovat tyyppiä Integer.
Logiikan jälkeen argumentit firstItem and secondItem,siirretään vastaavalle konstruktorille, on myös oltava tyyppi Integer tai sen alaluokka. Jos yrität siirtää tietotyyppiä, joka poikkeaa objektin luontiin määritetystä tietotyypistä, kääntäjä ei jätä tätä virhettä. Siten argumenttien rakentaja, kun esine on seuraava: Pari <Integer> obj = uusi Pair <> (uusi Kokonaisluku (1), uusia Integer (2)). Sama pätee setFirst- ja setSecond-menetelmien argumentteihin. Ja kuten olette todennäköisesti jo arvannut, getFirst- ja getSecond-menetelmät palauttavat tyypin Integer-arvot.
Yleinen luokka, jossa on useita tyyppiparametreja
Yleisessä luokat voivat myös ilmoittaa useita parametreja on tyyppiä, joka on asetettu kulmaan suluissa pilkulla. Uusittu tapaus Pari luokka on esitetty alla.
Kuten voit nähdä, kun luot tällaisen luokan esiintymääKulmakulmissa on määritettävä sama määrä tyyppejä kuin parametrit. Jos olet perehtynyt sellaiseen tietorakenteeseen kuin kartta, saatat huomata, että siinä käytetään samaa periaatetta. Siellä ensimmäinen argumentti määrittää avaimen tyypin ja toisen - tyypin arvon. On huomattava, että objektien luomiseen siirtyneet argumentit voivat olla samat. Joten seuraava Pair-luokan esiintymän ilmoitus on täysin oikea: Pair <String, String> obj.
Joitakin yleistämisominaisuuksia
Ennen jatkamista on huomattava, ettäJava-kääntäjä ei luo eri versioita Pair-luokasta. Itse asiassa kokoamisen aikana kaikki geneerisen tyypin tiedot poistetaan. Sen sijaan vastaavia tyyppejä valetaan ja luodaan Pair-luokan erityinen versio. Ohjelmassa on kuitenkin vielä yksi yleinen versio tästä luokasta. Tämä prosessi on kutsuttu Java Generic -tyyppisessä puhdistuksessa.
Huomaa tärkeä asia. Viittaukset saman java-yleiskategorian eri versioihin eivät voi viitata samaan objektiin. Eli sanotaan, että meillä on kaksi linkkiä: Pair <Integer> obj1 ja Pair <Double> obj2. Siksi rivillä obj1 = obj2 esiintyy virhe. Vaikka molemmat muuttujat ovat tyyppiä Pair <T>, kohteet, joihin he viittaavat ovat erilaisia. Tämä on elävä esimerkki Java Generic -tyyppien turvallisuudesta.
Yleisluokille asetetut rajoitukset
On tärkeää tietää, että yleistyksiä voidaan soveltaavain vertailutyypeille, eli parametrille generoidun luokan java-argumentin kautta annettu argumentti on luokan tyyppi. Tällaisia yksinkertaisia tyyppejä, kuten esimerkiksi kaksinkertaisia tai pitkiä, ei voida lähettää. Toisin sanoen seuraava Pair-luokan ilmoitus ei ole pätevä: Pair <int> obj. Tämä rajoitus ei kuitenkaan ole vakava ongelma, sillä Javailla on vastaava kääre-luokka jokaiselle primitiiviselle tyypille. Tarkkaan ottaen jos luokka Pair haluat koteloida kokonaisluku ja totuusarvon avtoupakovka tekee kaiken puolestasi: pari <Integer, Looginen> obj = uusi pari <> (25, tosi).
Toinen vakava rajoitus onmahdottomuus luoda tyyppiparametria. Joten seuraava rivi aiheuttaa kokoamisvirheen: T first = uusi T (). Tämä on ilmeistä, koska et tiedä etukäteen, onko täysi luokka tai abstrakti käyttöliittymä ohitettu argumenttina. Sama koskee myös ryhmien luomista.
Rajoitetut tyypit
Melko usein on tilanteita, joissaOn tarpeen rajoittaa tyyppiluetteloa, joka voidaan siirtää argumentiksi java-yleisluokkaan. Oletetaan, että Pair-luokassamme haluamme kapseloida yksinomaan numeeriset arvot niiden myöhempiin matemaattisiin operaatioihin. Tätä varten meidän on asetettava tyyppiparametrin yläraja. Tämä toteutetaan käyttämällä superluokka-ilmoitusta, jonka perustavat kaikki kulman kulmassa kulkevat argumentit. Se näyttää tältä: luokan Pair <T extends Number>. Tällä tavoin kääntäjä oppii, että T-parametrin sijaan voit korvata joko numeroluokan tai jonkin alaluokan.
Tämä on yleinen tekniikka. Tällaisia rajoituksia käytetään usein varmistamaan samaan luokkaan kuuluvien tyyppiparametrien yhteensopivuus. Harkitse esimerkki Pair-luokasta: luokka Pair <T, V laajentaa T>. Tässä kerrotaan kääntäjälle, että tyypin T voi olla mielivaltainen, ja tyypin V täytyy olla joko tyyppi T tai jokin sen alaluokista.
Rajoitus "alhaalta" tapahtuu täsmälleen samakuva, mutta sanan sijasta sana super on kirjoitettu. Eli luokan Pair <T super ArrayList> -ilmoitus osoittaa, että T: n sijasta voidaan korvata joko ArrayList tai mikä tahansa luokka tai rajapinta, jonka se perii.
Yleiset Java-menetelmät ja konstruktorit
Java-yleistymistä voidaan soveltaa paitsi luokkiin myös menetelmiin nähden. Niinpä yleistetty menetelmä voidaan julistaa tavalliselle luokalle.
Kuten yllä olevassa kuvassa on nähtävissä, yleistetyn menetelmän ilmoittamisessa ei ole mitään monimutkaista. Riittää laittaa kulmakannattimet ennen palautustyyppimenetelmää ja määritellä niihin tyypin parametrit.
Rakennuttajan tapauksessa kaikki tehdään samalla tavoin:
Tässä tapauksessa kulmakannattimet sijoitetaan konstruktorin nimen eteen, koska se ei palauta mitään arvoa. Molempien ohjelmien työn tulos on:
kokonaisluku
jono