Универсальная контейнерная фабрика Java - PullRequest
2 голосов
/ 17 августа 2011

Я хочу создать фабрику для контейнеров кэша, что-то вроде

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 ]

3 голосов
/ 17 августа 2011

Ваш код скомпилируется, если вы добавите еще один <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 голос
/ 17 августа 2011

Если вы просто хотите, чтобы он компилировался, вы можете просто сделать это:

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