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