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

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Odpovedet emailem