Yleiset tyypit

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.

Type Parameter and Type Argument Terminology: Monet kehittäjät käyttävät termejä ”type parameter” ja ”type argument” vuorotellen, mutta nämä ehdot eivät ole samat. Koodaamisen yhteydessä annetaan tyypin argumentit parametrisoidun tyypin luomiseksi. Siksi T Foo < T > on tyypin parametri ja merkkijono Foo < Merkkijono > f on tyypin argumentti. Tässä oppitunnissa noudatetaan tätä määritelmää näitä termejä käytettäessä.

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>(...));

Write a Comment

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *