dobrý den,

bohužel java překladač neumí Kovarianci a kontravarianci
http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)
(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]>

> 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
>
>
>

Odpovedet emailem