- V Javě je Iterable<String> potomkem Iterable<Object> protože je to v reálu ten samej objekt - pouze překladač nás může chránit tak jako máte ve 2 příkladě.. (to samé pro List) - V druhém případě souhlasím že koo. by byla nežádoucí v List to ale nikdo nepožaduje.
jinak předpokládám že jste měl na mysli koo. a kontra. v parametrech jako např. http://etymon.blogspot.com/2007/02/java-generics-and-covariance-and.html já ale měl spíše namysli koo. v generikách v Iterable jako např. v http://msdn.microsoft.com/library/dd799517.aspx Petr Dne 20. září 2011 8:02 "Zdeněk Troníček" <[email protected]> napsal(a): > 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 > >> > >> > >> > > > >
