Základy genericity

Java Objektově orientované programování Základy genericity

V tomto článku si řekneme něco málo o genericitě a proč ji používat. Tento článek nebude obsahovat celou problematiku, ale jen část z ní. Syntaxe je podobná jako u kolekcí.

V každém složitějším programu mohou vznikat chyby, které se špatně hledají. Vznikají většinou úplně někde jinde než byl jejich zdroj začátku. Genericita zlepšuje stabilitu kódu, protože umožňuje detekovat více chyb při překladu.

Nejdříve 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);
        }
}

V takovémhle případě překladač nic nehlásí a chyba se zobrazí až při běhu programu kdy havaruje s vyjímkou ClassCastException. Kdyby zde byla genericita, chyba by se již hlásila při překladu.

Teď si tenhle pří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 tomhle příkladě je schránka jen pro celočíselný typ. Pokud se pokusíme do něj dávat něco jiného, např. String, překladač zahlásí chybu.

Zde je seznam běžně používaných typů:

Parametry typu:

  • E - element (používá se při kolekcích)
  • K - key
  • N - number
  • T - typ
  • V - value
  • S, U, V atd. další typy

Menší ukázka:

//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, který se značí takhle: <?>

//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;
        }
}

Snad jsem vám nastínil o co jde a pochopili jste aspoň část z toho.


 

  Aktivity (1)

Článek pro vás napsal Fugiczek
Avatar

Jak se ti líbí článek?
Celkem (3 hlasů) :
4444 4


 



 

 

Komentáře

Avatar
Martin.mak
Člen
Avatar
Martin.mak:

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

 
Odpovědět 27.8.2014 21:33
Avatar
jan.ruzicka01
Redaktor
Avatar
Odpovídá na Martin.mak
jan.ruzicka01:

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

Odpovědět  +1 4.5.2015 18:14
';' je má jediná noční můra...
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 2 zpráv z 2.