10 komentáře “This (self) v generikách

  1. Je dobré si pamatovat, že přesně touhle konstrukcí je definováno java.lang.Enum. Pak už se to hledá snadno :-)

  2. Taky to na pár místech používáme. Je to fajn trik. Akorát když pak vedle této hierarchie vznikne nějaká paralelní (např. AbstractParentFactory, FooFactory, BarFactory), zatáhnou se generiky i do ní a pak jsou všechny třídy z obou hierarchií parametrizovány dvěma typovými parametry, jedním z každé hierachie. Což je někdy na škodu čitelnosti, ale pořád je zachována typová bezpečnost.

  3. Častěji používám generickou metodu, protože je jednodušší:

    @SuppressWarnings(„unchecked“)
    T getMe() {
    return (T) this;
    }

    Hodí se to však pouze pro případy, kdy potomci o sobě nevědí, protože je možné toto:

    public class Bar extends AbstractParent {

    public Bar makeLowerCase() {
    return getMe();
    }

    public Foo m() {
    return getMe();
    }
    }

    Volání m() pak pochopitelně skončí výjimkou.

  4. Ad) Zdeněk Troníček – z příkladu úplně nechápu, jak zajistíš to odvození typu na potomka – tj. aby bez castování prošel zápis:

    new Bar().addText(„Hello „).addText(„world!“).makeLowerCase().buildString();

    Ta volání addText by se v tvém případě vyhodnotila na AbstractParent, kde ta metoda makeLowerCase() chybí.

    Nebo jsem to jen špatně pochopil? Nezmizely ti generiky při přidávání komentáře?

  5. No jo, zmizely. Tak ještě jednou:

    @SuppressWarnings(„unchecked“)
    <T extends AbstractParent> T getMe() {
    return (T) this;
    }

    Jinak ten příklad, který uvádíš, neprojde. V tomto ohledu to samozřejmě na Tvoje řešení nemá.

  6. Neco podobneho jsem resil pri vytvareni obecneho nodu ve strome, kdy jsem chtel zajistit, aby deti byly stejneho typu jako definovany node (selftype), a take, aby parent byl stejneho typu. Zaroven zachovat typovou bezpecnost a dedeni (genericky typ nahradit potomkem, ktery ma navic nejake atributy):

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>