Pôvodné typy v Jave

1. Úvod

V tomto rýchlom výučbe sa pozrieme na nespracované typy, na to, aké sú a prečo by sme sa im mali vyhnúť.

2. Surové typy

Surový typ je názov pre všeobecné rozhranie alebo trieda bez argumentu typu:

Zoznam zoznam = nový ArrayList (); // surový typ

Namiesto:

Zoznam listIntgrs = nový ArrayList (); // parametrizovaný typ

Zoznam je a parametrizovaný typ rozhrania Zoznam zatiaľ čo Zoznam je a surový typ rozhrania Zoznam.

Nespracované typy môžu byť užitočné pri prepojení s negenerickým starým kódom.

Inak však je to odradene. To je preto, že:

  1. Nie sú expresívne
  2. Chýba im typová bezpečnosť a
  3. Problémy sa pozorujú za behu, a nie za kompilácie

3. Neexpresívne

Surový typ sa nedokumentuje a vysvetľuje sa tak, ako to robí parametrizovaný typ.

Ľahko z toho môžeme odvodiť parametrizovaný typ Zoznam je zoznam, ktorý obsahuje Strings. Surovému typu však táto jasnosť chýba, čo sťažuje prácu s ním a s jeho metódami API.

Pozrime sa na podpis metódy get (int index) v Zoznam rozhranie, aby ste tomu lepšie porozumeli:

/ ** * Vráti prvok na zadanú pozíciu v tomto zozname. * * @param index indexu prvku, ktorý sa má vrátiť * @return prvok na určenej pozícii v tomto zozname * @throws IndexOutOfBoundsException, ak je index mimo rozsah * (index = size ()) * / E get (int index) ;

Metóda get (int index) vracia a String v polohe index v parametrizovanom type Zoznam.

Avšak na surový typ Zoznam, vráti znak Objekt. Preto sa od nás vyžaduje, aby sme vynaložili ďalšie úsilie na kontrolu a identifikáciu typu prvku v surovom type Zoznam a pridať vhodný typový odliatok. To môže zaviesť chyby za behu, ako je surový typ nie je bezpečný typ.

4. Nie je typovo bezpečný

Získame predgenerické správanie so surovými typmi. Preto surový typ Zoznam prijíma Objekt a môže obsahovať prvok ľubovoľného dátového typu. To môže viesť k problémom s bezpečnosťou typov, keď kombinujeme parametrizované a nespracované typy.

Pozrime sa na to vytvorením kódu, ktorý vytvorí inštanciu a Zoznam pred odovzdaním metóde, ktorá akceptuje surový typ Zoznam a pridáva Celé číslo k tomu:

public void methodA () {List parameterizedList = new ArrayList (); parameterizedList.add ("Hello Folks"); methodB (parameterizedList); } public void methodB (List rawList) {// raw type! rawList.add (1); }

Kód sa skompiluje (s varovaním) a Celé číslo sa pridá k surovému typu Zoznam po vykonaní. The Zoznam to bolo prijaté ako argument teraz obsahuje a String a an Celé číslo.

Kompilátor vytlačí varovanie kvôli použitiu nespracovaných typov:

Poznámka: RawTypeDemo.java používa nekontrolované alebo nebezpečné operácie. Poznámka: Prekompilovať s -Xlint: podrobnosti nezačiarknuté.

5. Problémy za behu

Nedostatok bezpečnosti typu na surovom type má kauzálny účinok, ktorý môže za behu viesť k výnimkám.

Upravme predchádzajúci príklad tak, aby metódaA dostane prvok na indexovej pozícii 1 našej Zoznam po zavolaní metóda B.:

public void methodA () {List parameterizedList = new ArrayList (); parameterizedList.add ("Hello Folks"); methodB (parameterizedList); Reťazec s = parameterizedList.get (1); } public void methodB (List rawList) {rawList.add (1); }

Kód sa kompiluje (s rovnakým varovaním) a hodí a ClassCastException po vykonaní. To sa stáva ako metóda get (int index) vracia Celé číslo, ktoré nemožno priradiť k premennej typu String:

Výnimka vo vlákne „main“ java.lang.ClassCastException: java.lang.Integer nie je možné odovzdať do java.lang.String

6. Záver

S hrubými typmi sa ťažko pracuje a môžu v našom kóde spôsobiť chyby.

Ich použitie môže viesť k následkom, ktoré môžu byť katastrofálne, a bohužiaľ, väčšina z týchto katastrof sa stane za behu.

Prezrite si všetky úryvky v tomto výučbe na GitHub.