Dobrý den,

kovariance a kontravariance s tímto nesouvisí (navíc Java kovariantní
return má). Váš příklad

Iterable<Object> o = new ArrayList<String>();

nejde přeložit jednoduše z toho důvodu, že v Javě není Iterable<String>
potomkem Iterable<Object>.

A to z jednoduchého důvodu. Kdyby např. List<String> byl potomkem
List<Object>, pak by šlo napsat:

List<String> s = new ArrayList<String>();
List<Object> o = s;
o.add(new Object()); // v seznamu řetězců máme Object!!!

Z.T.
-- 
Zdenek Tronicek
FIT CTU in Prague


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