2011-08-17 1 views
2

Je veux faire une usine pour les conteneurs de cache, quelque chose commeJava usine de conteneur générique

public interface CacheMapFactory { 
    public Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass); 
} 

avec une implémentation simple possible pour les tests

public class InMemoryCacheMapFactory implements CacheMapFactory { 
    public Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass) { 
     return new HashMap<K,V>(); 
    } 
} 

D'autres implémentations peuvent être, par exemple, sur la base Memcached ou un autre stockage de valeur-clé.

Est-il possible de convertir le pseudo-code ci-dessus en quelque chose de compilable avec la sémantique désirée?

Répondre

3

Votre code compilerait si vous ajoutez un autre <K,V> aux méthodes:

public interface CacheMapFactory { 
    public <K,V> Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass); 
} 

public class InMemoryCacheMapFactory implements CacheMapFactory { 
    public <K,V> Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass) { 
    return new HashMap<K,V>(); 
    } 
} 

Je ne suis pas sûr de ce que l'tag ferait, mais je suppose que cela fait partie de la mise en œuvre ultérieure.

De plus, vous pouvez compter sur l'inférence de type comme ceci:

public interface CacheMapFactory { 
    public <K,V> Map<K,V> createCacheMap(String tag); 
} 

public class InMemoryCacheMapFactory implements CacheMapFactory { 
    public <K,V> Map<K,V> createCacheMap(String tag) { 
    return new HashMap<K,V>(); 
    } 
} 

public class Test { 
    public void test() { 
    CacheMapFactory f = new InMemoryCacheMapFactory(); 
    Map<String, Long> m = f.createCacheMap("mytag"); //K and V are inferred from the assignment 
    } 
} 
1

Si vous voulez juste pour compiler vous pouvez simplement faire ceci:

public interface CacheMapFactory { 
    public <K, V> Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass); 
} 
Questions connexes