Aktuálně: Postihly zákazy tvou profesi? Poptávka po ajťácích prudce roste, využij slevové akce 30% výuky zdarma!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP
PHP týden

Základy genericity

V tomto článku si povieme niečo málo o genericitě a prečo ju používať. Tento článok nebude obsahovať celú problematiku, ale len časť z nej. Syntax je podobná ako u kolekcií.

V každom zložitejším programe môžu vznikať chyby, ktoré sa zle hľadajú. Vznikajú väčšinou úplne niekde inde ako bol ich zdroj začiatku. Genericita zlepšuje stabilitu kódu, pretože umožňuje detekovať viac chýb pri preklade.

Najskôr si ukážeme kód bez genericity ...

public class Box{
    private Object object;

    public void pridat(Object object){
        this.object=object;
    }

    public Object zjistit(){
        return object;
    }
}
public class BoxDemo{
    public static void main(String[]args){
        Box schrankaSCisly=new Box();
        schrankaSCisly.pridat("10"); //pridavam string i kdyz je schránka určena nečemu jinému
        Integer cislo=(Integer)schrankaSCisly.zjistit(); //chci cislo typu Int
        System.out.println(cislo);
    }
}
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

V takomto prípade prekladač nič nehlási a chyba sa zobrazí až pri behu programu kedy havaruje s výnimkou ClassCastException. Keby tu bola genericita, chyba by sa už hlásila pri preklade.

Teraz si tento príklad napíšeme s genericitou.

public class Box<T>{
    private T t; //T oznacuje typ

    public void pridat(T t){
        this.t=t;
    }

    public T zjistit(){
        return t;
    }
}
public class BoxDemo2{

    public static void main(String[]args){
        Box<Integer>schrankaSCisly=new Box<Integer>;
        schrankaSCisly.pridat(new Integer(10));
        Integer cislo=schrankaSCisly.zjistit(); //nemusime pouzit pretypovani
    }
}

V tomto príklade je schránka len pre celočíselný typ. Ak sa pokúsime doň dávať niečo iné, napr. String, prekladač zahlási chybu.

Tu je zoznam bežne používaných typov:

Parametre typu:

  • E - element (používa sa pri kolekciách)
  • K - key
  • N - number
  • T - typ
  • V - value
  • S, U, V atď. Ďalšie typy

Menšie ukážka:

//mame oddeleni ve firme kde muzou byt zamestnanci
interface Oddeleni<E> extends Collection<E>;
//grafik je jeden ze zamestnancu
interface Grafik extends Zamestnanec{}
Grafik grafik=...;
//potrebujeme zamestnance ktereho "pasujeme" na grafika
Zamestnanec a=grafik;
//a samozrejme pro grafiky muzeme vytvorit oddeleni
Oddeleni<Grafik>oddeleniGrafiku=...;
oddeleniGrafiku.pridat(grafik);
//do takoveho oddeleni nemuzeme pridat nikoho jineho =)
//pokud vytvorime toto
Oddeleni<Zamestnanec>oddeleni=...;
//tak sem nemuzeme pridavat ostatni zamestnance, uz jenom z toho duvodu ze se vsichni spolu nesnesou (napr. grafici s programatorama :D)
//teoreticky muzete ale byl by v tom bordel
oddeleni=oddeleniGrafiku; //chyba

Existuje taky zástupný znak, ktorý sa značí takto: <?>

//mame nejake oddeleni zamestnancu
Oddeleni<? extends Zamestanec> oddeleni=...;

//takze muzeme vytvorit oddeleni grafiku a udelat pak toto
oddeleni=oddeleniGrafiku;

//jenze nemuzeme pridavat dalsi zamestnance ale muzeme napriklad vyplacet oddeleni jednotlive
void vyplatitZamestnance(Oddeleni<? extends Zamestnanec>oddeleni){
    for(Zamestnanec a: oddeleni){
        a.vyplatit;
    }
}

Snáď som vám načrtol o čo ide a pochopili ste aspoň časť z toho.


 

Všetky články v sekcii
Objektovo orientované programovanie v Jave
Článok pre vás napísal Fugiczek
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
Aktivity (1)

 

 

Komentáre

Avatar
Martin.mak
Člen
Avatar
Martin.mak:27.8.2014 21:33

Dala by se genericita shrnout nějakou definicí? :)

 
Odpovedať
27.8.2014 21:33
Avatar
Odpovedá na Martin.mak
jan.ruzicka01:4.5.2015 18:14

Genericita umožňuje vytvořit hodnotu zastupující volitelný typ. (Například ArrayList<String>, nebo HashMap<Integer, Double>)

Odpovedať
4.5.2015 18:14
Važme si diverzity jazyků.
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
Tonda Đình Hoàng:5.5.2018 12:53

nechybí nahodou tady () ?
Box<Integer>schran­kaSCisly=new Box<Integer>;
->
Box<Integer>schran­kaSCisly=new Box<Integer>();

 
Odpovedať
5.5.2018 12:53
Avatar
Petr Juříček:21.5.2019 8:44

Tenhle clanek mi prijde dost nestastnej :( tak nejak z toho nevim ani hlavu ani patu ... a zdrojaky k tomu nejsou aby to nejak fungovalo ... nevim jak ostatni ale ocenil bych to vysvetlit jako pro blby ... pro me :D

Odpovedať
21.5.2019 8:44
Jeden život , jedna šance
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 4 správy z 4.