开发者

Java generic container factory

开发者 https://www.devze.com 2023-03-28 11:06 出处:网络
I want to make a factory for cache containers, something like public interface CacheMapFactory { public Map<K,V> createCacheMap(String tag, Class<K> kClass, Class<V> vClass);

I want to make a factory for cache containers, something like

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

with a possible simple implementation for testing

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

Other implementations might be, for example, based on Memcached or some other key-value storage.

Is it possible to convert the pseudocode above into something compileable with the desired semantics?


Your code would compile if you add another <K,V> to the methods:

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>();
  }
}

I'm not sure what the tag would do, but I guess that's part of the further implementation.

Additionally, you could rely on type inference like this:

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


If you just want it to compile then you can just do this:

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

精彩评论

暂无评论...
验证码 换一张
取 消