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