Java通用容器工厂

时间:2011-08-17 08:42:29

标签: java generics factory-pattern

我想为缓存容器创建一个工厂,比如

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或其他一些键值存储。

是否可以将上面的伪代码转换为具有所需语义的可编译代码?

2 个答案:

答案 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);
}