Zdravím, to je typický problém s generiky v Javě, ta jsou implementována pomocí erasure, takže typ Cache<String,String> za běhu neexistuje, existuje jenom soubore Cache.class pro raw typy.
Ale dá se to obejít, takhle: static interface CacheSS extends Cache<String,String> { } public static void main(String[] args) { Cache<String, String> cache = ComponentFactory.getComponent(CacheSS.class, TEST_CACHE); } Trik je v tom, že interface CacheSS není generická, ale parametrizovaná třída, takže má svůj soubor CacheSS.class s bytekódem. Makub Dne 19.9.2011 13:20, Petr Novak napsal(a):
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
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CERIT-SC Martin Kuba Institute of Computer Science email: ma...@ics.muni.cz Masaryk University http://www.ics.muni.cz/~makub/ Botanicka 68a, 60200 Brno, CZ mobil: +420-603-533775 --------------------------------------------------------------
smime.p7s
Description: S/MIME Cryptographic Signature