Geneerinen tyyppi on yleinen luokka tai käyttöliittymä, joka on parametrisoitu tyyppien yli. Seuraava Box-luokka muokataan konseptin esittelemiseksi.
Yksinkertainen laatikkoluokka
Aloita tutkimalla ei-yleistä Box-luokkaa, joka toimii minkä tahansa tyyppisillä esineillä. Sen on annettava vain kaksi tapaa: set, joka lisää objektin ruutuun, ja get, joka noutaa sen:
Koska sen menetelmät hyväksyvät tai palauttavat objektin, voit vapaasti siirtää mitä haluat , edellyttäen, että se ei kuulu primitiivisiin tyyppeihin. Ei ole mitään tapaa tarkistaa kääntämisen aikana luokan käyttöä. Yksi koodin osa saattaa sijoittaa kokonaisluvun ruutuun ja odottaa pääsevänsä kokonaisluvut ulos, kun taas toinen koodin osa saattaa vahingossa siirtää merkkijonon, mikä johtaa ajonaikaisvirheeseen.
Yleinen versio laatikkoluokan
Yleinen luokka määritetään seuraavassa muodossa:
class name<T1, T2, ..., Tn> { /* ... */ }
Päivitä Box-luokka käyttää geneerisiä aineita luomalla yleinen tyyppideklarointi vaihtamalla koodi ”public class Box” muotoon ”public class Box” < T > ”. Tämä esittelee tyypin muuttujan T, jota voidaan käyttää missä tahansa luokan sisällä.
Tämän muutoksen myötä Box-luokasta tulee:
Kuten näette, kaikki objektin esiintymät ovat Korvataan T. Tyyppimuuttuja voi olla mikä tahansa valitsemasi ei-primitiivinen tyyppi: mikä tahansa luokkatyyppi, mikä tahansa liitäntätyyppi, mikä tahansa matriisityyppi tai jopa toinen tyyppinen muuttuja.
Tätä samaa tekniikkaa voidaan käyttää luomaan yleiset rajapinnat.
Tyyppiparametrien nimeämiskäytännöt
Tavanomaisesti tyypin parametrien nimet ovat yksittäisiä, isoja kirjaimia. Tämä on jyrkässä ristiriidassa muuttujien nimeämiskäytäntöjen kanssa, joista tiedät jo, ja hyvästä syystä: Ilman tätä käytäntöä olisi vaikeaa erottaa tyypin muuttujan ja tavallisen luokan tai liitännän nimi. p> Yleisimmin käytetyt tyyppiparametrien nimet ovat:
- E – Elementti (käytetään laajasti Java Collections Frameworkissa)
- K – avain
- N – luku
- T – tyyppi
- V – arvo
- S, U, V jne. – 2., 3., 4. tyyppi
Näet nämä nimet, joita käytetään koko Java SE -sovellusliittymässä ja tämän oppiaiheen loppuosassa.
Yleisen tyypin kutsuminen ja aloittaminen
Viitataksesi yleiseen Box-luokkaan koodissasi sinun on suoritettava yleinen tyyppikutsu, joka korvaa T: n jollakin konkreettisella arvolla, kuten kokonaisluku:
Box<Integer> integerBox;
Voit ajatella, että yleinen tyyppikutsu on samanlainen kuin tavallinen menetelmäkutsu, mutta sen sijaan, että välittäisit argumentin ethod, välität tyypin argumentin – tässä tapauksessa kokonaisluvun – itse Box-luokalle.
Kuten mikä tahansa muuttujailmoitus, tämä koodi ei todellakaan luo uutta Box-objektia. Se yksinkertaisesti ilmoittaa, että kokonaislukulaatikossa on viittaus ”Kokonaislaatikkoon”, jolloin ruutu < Kokonaisluku > luetaan.
Geneerisen tyypin kutsu tunnetaan yleensä parametrisoituna.
Tämän luokan instantisoimiseksi käytä uutta avainsanaa, kuten tavallista, mutta aseta < Kokonaisluku > luokan nimen ja sulkeiden välillä:
Box<Integer> integerBox = new Box<Integer>();
Timantti
Java SE 7: ssä ja sitä uudemmissa versioissa voit korvata tyypin argumentit, jotka tarvitaan yleisen luokan rakentajan kutsumiseksi, tyhjällä joukolla tyypin argumentteja (< >) niin kauan kuin kääntäjä pystyy määrittämään tai päättelemään tyypin argumentit kontekstista. Tätä kulmasulkeiden paria, < >, kutsutaan epävirallisesti timantiksi. Voit esimerkiksi luoda laatikon < kokonaisluku > esiintymän seuraavalla lausekkeella:
Box<Integer> integerBox = new Box<>();
Lisätietoja timanttien merkinnöistä ja tyyppipäätöksistä on kohdassa Tyyppijärjestelmä.
Useiden tyyppien parametrit
Kuten aiemmin mainittiin, yleisellä luokalla voi olla useita tyypin parametreja.Esimerkiksi yleinen OrderedPair-luokka, joka toteuttaa yleisen pariliitännän:
Seuraavat lauseet luovat kaksi esimerkkiä OrderedPair-luokasta:
Koodi, uusi OrderedPair < Merkkijono, kokonaisluku >, instantioi K: n merkkijonoksi ja V kokonaislukuna. Siksi OrderedPairin konstruktorin parametrityypit ovat vastaavasti merkkijono ja kokonaisluku. Autoboxingista johtuen on kelvollinen välittää merkkijono ja int luokalle.
Kuten The Diamond mainitsi, koska Java-kääntäjä voi päätellä K- ja V-tyypit ilmoituksesta OrderedPair < String, Integer >, näitä lauseita voidaan lyhentää timanttimerkinnällä:
OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);OrderedPair<String, String> p2 = new OrderedPair<>("hello", "world");
Luo yleinen käyttöliittymä noudattamalla samoja käytäntöjä kuin yleisluokan luomisessa.
Parametroidut tyypit
OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...));