Java Generics - vs.

1. Oversikt

I denne raske opplæringen ser vi likheter og forskjeller mellom og i Java Generics.

Dette er imidlertid et avansert tema, og det er viktig å få en grunnleggende forståelse av emnet før vi dykker inn i kjernen i saken.

2. Bakgrunn for generiske stoffer

Generics ble introdusert i JDK 5 for å eliminere kompileringsfeil og styrke typesikkerhet. Denne ekstra typesikkerheten eliminerer casting i noen brukstilfeller og gir programmerere muligheten til å skrive generiske algoritmer, som begge kan føre til mer lesbar kode.

For eksempel, før JDK 5, må vi jobbe med elementene i en liste ved hjelp av casting. Dette skapte igjen en viss klasse kjøretidsfeil:

Liste aList = ny ArrayList (); aList.add (nytt heltal (1)); aList.add ("a_string"); for (int i = 0; i <aList.size (); i ++) {Integer x = (Integer) aList.get (i); }

Nå har denne koden to problemer vi vil løse:

  • Vi trenger en eksplisitt rollebesetning for å hente ut verdier fra en liste - typen avhenger av variabeltypen til venstre - Heltall i dette tilfellet
  • Vi får en kjøretidsfeil på den andre iterasjonen når vi prøver å kaste en streng til en Heltall

Generikk fyller rollen for oss:

Liste iList = ny ArrayList (); iList.add (1); iList.add ("a_string"); // kompilere tidsfeil for (int i = 0; i <iList.size (); i ++) {int x = iList.get (i); } 

Kompilatoren vil fortelle oss at det ikke er mulig å legge til en streng til en Liste av typen Heltall, som er bedre enn å finne ut på kjøretid.

Dessuten er det ikke nødvendig med noen eksplisitt casting siden kompilatoren allerede vet det iList holder Heltalls. I tillegg, på grunn av magien ved unboxing, trengte vi ikke engang en Heltall type, er dens primitive form nok.

3. Jokertegn i generiske

Et spørsmålstegn, eller jokertegn, brukes i generikk for å representere en ukjent type. Det kan ha tre former:

  • Ubegrensede jokertegn: Liste representerer en liste over ukjent type
  • Øvre avgrensede jokertegn: Liste representerer en liste over Nummer eller dens undertyper som Heltall og Dobbelt
  • Wildcards med lavere grenser: Liste representerer en liste over Heltall eller supertypene Nummer og Gjenstand

Nå, siden Gjenstand er den iboende super-typen av alle typer i Java, ville vi bli fristet til å tro at den også kan representere en ukjent type. Med andre ord, Liste og Liste kunne tjene det samme formålet. Men det gjør de ikke.

La oss vurdere disse to metodene:

public static void printListObject (List list) {for (Object element: list) {System.out.print (element + ""); }} offentlig statisk ugyldig printListWildCard (Listeliste) {for (Objektelement: liste) {System.out.print (element + ""); }} 

Gitt en liste over Heltalls, si:

Liste li = Arrays.asList (1, 2, 3);

printListObject (li) vil ikke kompilere, og vi får denne feilen:

Metoden printListObject (List) gjelder ikke for argumentene (List)

Mens printListWildCard (li) vil kompilere og vil sende ut 1 2 3 til konsollen.

4. og - Likhetene

I eksemplet ovenfor, hvis vi endrer metodesignaturen for printListWildCard til:

offentlig statisk ugyldig utskriftListWildCard (liste liste)

Det ville fungere på samme måte som printListWildCard (liste liste) gjorde. Dette skyldes det faktum at Gjenstand er en supertype av alle Java-objekter, og i utgangspunktet strekker alt seg Gjenstand. Så, a Liste av Heltalls blir også behandlet.

Kort oppsummert, det betyr at ? og ? utvider Objekt er synonyme i dette eksemplet.

Mens det i de fleste tilfeller holder seg, men det er også noen forskjeller. La oss se på dem i neste avsnitt.

5. og - forskjellen

Reifiserbare typer er de hvis type ikke slettes på kompileringstidspunktet. Med andre ord vil en ikke-refifiserbar types kjøretidsrepresentasjon ha mindre informasjon enn dens kompileringstidsmotpart, fordi noe av det blir slettet.

Som hovedregel kan ikke parametriserte typer refifiseres. Dette betyr Liste og Kart kan ikke refunderes. Kompilatoren sletter typen og behandler dem som en Liste og Kart henholdsvis.

Det eneste unntaket fra denne regelen er ubegrensede jokertegntyper. Dette betyr Liste og Kart er gjenopprettelig.

På den andre siden, Liste kan ikke refunderes. Selv om det er subtilt, er dette en bemerkelsesverdig forskjell.

Ikke-repeterbare typer kan ikke brukes i visse situasjoner, for eksempel i en tilfelle av operatør eller som elementer i en matrise.

Så hvis vi skriver:

List someList = new ArrayList (); boolsk forekomstTest = someList forekomst av liste

Denne koden kompilerer og instansetest er ekte.

Men hvis vi bruker tilfelle av operatør på Liste:

List anotherList = new ArrayList (); boolsk forekomstTest = anotherList forekomst av Liste;

da kompilerer ikke linje 2.

På samme måte kompileres linje 1 i kodebiten nedenfor, men linje 2 gjør det ikke:

Liste [] arrayOfList = ny liste [1]; Liste [] arrayOfAnotherList = ny liste [1]

6. Konklusjon

I denne korte veiledningen så vi likhetene og forskjellene i og .

Selv om det for det meste er likt, er det subtile forskjeller mellom de to når det gjelder å bli gjengitt eller ikke.


$config[zx-auto] not found$config[zx-overlay] not found