我想为缓存容器创建一个工厂,比如
public interface CacheMapFactory {
public Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass);
}
可能有一个简单的测试实现
public class InMemoryCacheMapFactory implements CacheMapFactory {
public Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass) {
return new HashMap<K,V>();
}
}
其他实现可能是,例如,基于Memcached或其他一些键值存储。
是否可以将上面的伪代码转换为具有所需语义的可编译代码?
答案 0 :(得分:3)
如果您向方法添加另一个<K,V>
,您的代码将被编译:
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>();
}
}
我不确定tag
会做什么,但我想这是进一步实施的一部分。
此外,你可以依赖这样的类型推断:
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 :(得分:1)
如果您只是想要编译,那么您可以这样做:
public interface CacheMapFactory {
public <K, V> Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass);
}