Díky všem za vysvětlení :). Tak trochu jsem rád, že to je chyba jazyka, i když bych byl radši, kdyby nebyla :). Každopádně mě ani tak nešlo o nějaké kontroly, natož kontroly za Runtime, apod. (ne že by to nebylo super). Prostě mě jen vadila ta kosmetická vada, že když mám něco vlevo od rovnítka a když to samé použiji vpravo, tak očekávám, že nebude překladač prudit s warningy, apod. Šlo mi čistě o tu kosmetiku - nerad ignoruji podobná hlášení. A hlavně jsem si chtěl být jistý, že nedělám jen chybu v zápisu. Taky mi šlo o to, že jsem autorem té factory-metody na naší platformě a tak se mi nelíbí, když našim vývojářům dávám příklady použití, které jsou pak plné warningů a zavání, jako kdyby programovali něco proti pravidlům toho jazyka. Podědit tu třídu je zajímavý nápad, ale touto cestou nepůjdu (zbytečně mnoho kódu navíc prakticky bez užitku, to ty genericy pak nemusíme používat vůbec) , hold v tomto případě budou muset vyjímečně použít:
   @SuppressWarnings("unchecked")
Cache<String, String> cache = UESComponentFactory.getComponent(Cache.class, TEST_CACHE);

Ale ještě jednou všem díky, hezký zbytek dne

Petr



Dne 19.9.2011 14:37, Petr Balat napsal(a):
dobrý den,

bohužel java překladač neumí Kovarianci a kontravarianci http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science) <http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29> (viz google -> Covariance a Contravariance) proto bude java varovat při výrazech typu
Cache<String, String> cache = ComponentFactory.getComponent(Cache.class)
nebo např. nepůjde zkompilovat Iterable<Object> o = new ArrayList<String>(); ale bohužel se i při překladu informace o typu v parametru ztratí takže vás ani runtime neochrání pro vložení jiných typů než jsou definované.

Předpokládám ale že Vám jde o typovou kontrolu při kompilaci kde někde pouzijete Class<Cache<String,String>> cls=...;
Cache<String, String> = cls.createInstance();
můžete vytvorit tridu ktera bude dedit po Cache<String, String> potom Vam to kompilator vezme.

Ale myslím si že si tím nic nezachráníte (kdekoliv muze nekdo Cache<string, string> pretypovat na Cache a vlozit jiny typ a spadne to az pri vyzvednuti objektu a jeho typ) ale uměle budou vytvořeny zbytečné nové třídy takže bych se s varováním smířil nebo použil pokročilejší programovací jazyk jako např. c# :-)

S pozdravem
Petr Balat

2011/9/19 Petr Novak <[email protected] <mailto:[email protected]>>

    Zdravím konferenci,

     narazil jsem na problém s generic a nevím, jestli je problém jen
    v mé hlavě, nebo v javě a google mi zatím moc nepomohl, protože
    ani nevím jak se řádně zeptat.

    Problém je s následujícím kouskem kódu:

    Class<Cache<String,String>> cls = Cache.class;      // nelze
    zkompilovat, eclipse mi nabízí, abych  Class<Cache<String,String>>
    převedl jen na  Class<Cache>, ale to pak má warning, že používám
    RAW typy, což ani nechci :).

    Myslel jsem, že půjde zapsat
    Class<Cache<String,String>> cls = Cache<String,String>.class;
    //ale toto nelze kompilovat už vůbec, řve to, že Cache není
    definována a že ty závorky tam nemají být a kdo ví co ještě.

    Definice rozhraní cache je jednoduchá:  public interface Cache<K,
    V>{....}

    Původní problém je trochu jiný, ale důsledek stejný, ve
    skutečnosti potřebuji:
    Cache<String, String> cache =
    ComponentFactory.getComponent(Cache.class, CACHE_NAME);  //toto
    ale opět hází warning

    definice té metody je:
    public static <T> T getComponent(final Class<T> compClass, final
    String compName);

    čekal jsem možnost použití
    Cache<String, String> cache =
    UESComponentFactory.getComponent(Cache<String,String>.class,
    TEST_CACHE);  //ale jak plyne z výše uvedeného, toto nelze kompilovat



    Jediné řešení, které funguje compilačně a bez warningu je:
       @SuppressWarnings("unchecked")
       Cache<String, String> cache =
    UESComponentFactory.getComponent(Cache.class, TEST_CACHE);

    ale to se mi nelíbí.


    Nemáte někdo nějaký nápad, jak v javě zapsat  správně
     Cache<String,String>.class  ?  Klidně to můžete zkusit pro
     Map<String,String>  dopadne to stejně.

    Díky za veškeré podněty

    Petr





--
Petr

Odpovedet emailem