BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

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íjet následující firmy, které dost možná hledají právě tebe!

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šechny články v sekci
Objektovo orientované programovanie v Jave
Článek pro vás napsal Fugiczek
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Aktivity (1)

 

 

Komentáře

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

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

 
Odpovědět
27.8.2014 21:33
Avatar
Odpovídá 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>)

Odpovědět
4.5.2015 18:14
Važme si diverzity jazyků.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
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>();

 
Odpovědět
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

Odpovědět
21.5.2019 8:44
Jeden život , jedna šance
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.