Java Generics - vs.

1. Oversigt

I denne hurtige vejledning ser vi ligheder og forskelle mellem og i Java Generics.

Dette er imidlertid et avanceret emne, og det er bydende nødvendigt at få en grundlæggende forståelse af emnet, før vi dykker ned i kernen i sagen.

2. Generisk baggrund

Generics blev introduceret i JDK 5 for at eliminere kompileringstidsfejl og styrke typesikkerhed. Denne ekstra typesikkerhed eliminerer casting i nogle brugssager og giver programmører mulighed for at skrive generiske algoritmer, som begge kan føre til en mere læselig kode.

For eksempel, før JDK 5, bliver vi nødt til at arbejde med elementerne på en liste ved hjælp af casting. Dette skabte igen en bestemt klasse runtime-fejl:

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

Nu har denne kode to problemer, som vi gerne vil tage fat på:

  • Vi har brug for en eksplicit rollebesætning for at udtrække værdier fra En liste - typen afhænger af den variable type til venstre - Heltal I dette tilfælde
  • Vi får en runtime-fejl på den anden iteration, når vi prøver at caste en_streng til en Heltal

Generics udfylder rollen for os:

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

Compileren vil fortælle os, at det ikke er muligt at tilføje en_streng til en Liste af typen Heltal, hvilket er bedre end at finde ud af ved runtime.

Desuden er der ikke behov for nogen eksplicit casting, da compileren allerede ved det iListe holder Heltals. Derudover på grund af unboxingens magi behøvede vi ikke engang en Heltal type, dens primitive form er nok.

3. Jokertegn i generiske gener

Et spørgsmålstegn eller wildcard bruges i generiske gener til at repræsentere en ukendt type. Det kan have tre former:

  • Ubegrænsede jokertegn: Liste repræsenterer en liste over ukendt type
  • Øvre afgrænsede jokertegn: Liste repræsenterer en liste over Nummer eller dens undertyper såsom Heltal og Dobbelt
  • Wildcards med lavere grænse: Liste repræsenterer en liste over Heltal eller dets supertyper Nummer og Objekt

Nu siden Objekt er den iboende super-type af alle typer i Java, ville vi være fristet til at tro, at den også kan repræsentere en ukendt type. Med andre ord, Liste og Liste kunne tjene det samme formål. Men det gør de ikke.

Lad os overveje disse to metoder:

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

En liste over Heltals, sig:

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

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

Metoden printListObject (Liste) gælder ikke for argumenterne (Liste)

Der henviser til printListWildCard (li) vil kompilere og vil output 1 2 3 til konsollen.

4. og - lighederne

I ovenstående eksempel, hvis vi ændrer metodesignaturen for printListWildCard til:

offentlig statisk ugyldig printListWildCard (liste liste)

Det ville fungere på samme måde som printListWildCard (liste liste) gjorde. Dette skyldes, at Objekt er en supertype af alle Java-objekter, og stort set alt strækker sig Objekt. Så, en Liste af Heltals bliver også behandlet.

Kort sagt, det betyder at ? og ? udvider Objekt er synonyme i dette eksempel.

Mens det i de fleste tilfælde ville være tilfældet, men der er også et par forskelle. Lad os se på dem i næste afsnit.

5. og - forskellen

Genanvendelige typer er dem, hvis type ikke slettes på kompileringstidspunktet. Med andre ord vil en ikke-genoprettelig types runtime-repræsentation have mindre information end dens kompileringstidspartner, fordi noget af det bliver slettet.

Som hovedregel kan parametriserede typer ikke genanvendes. Det betyder Liste og Kort kan ikke refunderes. Compileren sletter deres type og behandler dem som en Liste og Kort henholdsvis.

Den eneste undtagelse fra denne regel er ubegrænsede jokertegnetyper. Det betyder Liste og Kort kan refunderes.

På den anden side, Liste kan ikke refunderes. Mens det er subtilt, er dette en bemærkelsesværdig forskel.

Ikke-repeterbare typer kan ikke bruges i visse situationer, f.eks. I en forekomst af operatør eller som elementer i en matrix.

Så hvis vi skriver:

Liste over someList = ny ArrayList (); boolean instanceTest = someList instanceof List

Denne kode kompilerer og instansTest er rigtigt.

Men hvis vi bruger forekomst af operatør til Liste:

Liste en anden liste = ny ArrayList (); boolsk instansTest = anotherList forekomst af liste;

derefter kompilerer linje 2 ikke.

På samme måde kompilerer linje 1 i nedenstående uddrag, men linje 2 gør ikke:

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

6. Konklusion

I denne korte vejledning så vi lighederne og forskellene i og .

Selvom det for det meste er ens, er der subtile forskelle mellem de to med hensyn til, at de kan refunderes eller ej.


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