2

我有一个要求,我想在哪里定义一个generic class实现一个generic interface.

这是我的自定义地图界面:

public interface ICache<K, T> {
     boolean containsKey(K k);
     T getValue (K key);
     void remove(K key);
     void put(K k, T t);
}

这是自定义类的实现:

 public class CustomCache<K, T> implements ICache<K, T> {

    private org.infinispan.Cache<K, T> cache;

    public CustomCache(org.infinispan.Cache<K, T> cache) {
        this.cache = cache;
    }

    @Override
    public boolean containsKey(K k) {
        return cache.containsKey(k);
    }

    @Override
    public T getValue(K key) {
        return cache.get(key);
    }

    @Override
    public void remove(K key) {
        cache.remove(key);
    }

   @Override
   public void put(K k, T t) {
       cache.put(k, t);
   }
}

但是当我尝试构建一个缓存时,我会收到类似“缓存是原始类型。对泛型缓存的引用应该参数化”之类的警告......

创建自定义地图的示例方法。

public ICache<?, ?> lookupCache(String cacheName) {
    ICache<?, ?> cache = null;
    Cache<?, ?> jCache = new DefaultCacheManager().getCache();
    cache = new CustomCache(jCache);
    return cache;
}

避免这种情况的一种方法是简单地使用@SuppressWarnings,但我可以使用泛型来修复它。

使用 <> 运算符虽然可以解决此问题,但我也需要使其与 1.6 兼容。

4

3 回答 3

2

我会把它实现为

public class Cache<K, T> implements ICache<K, T> {
    Map<K, T> map = new HashMap<K, T>();

    @Override
    public boolean containsKey(K k) {
        return map.containsKey(k);
    }

    @Override
    public T getValue(K key) {
        return map.get(key);
    }

    @Override
    public void remove(K key) {
        map.remove(key);
    }

    @Override
    public void put(K k, T t) {
        map.put(k, t);
    }
}

它作为适配器模式

于 2013-04-04T07:35:18.183 回答
1

警告几乎总结了它:您的类Cache是泛型类型,这意味着它需要类型参数,但是您对被Cache调用对象的引用jCache没有这样的类型参数。您不仅应该在声明中提供它们,还应该在初始化中提供它们,如下所示:

cache = new CustomCache<Object, Object>(jCache);

它基本上说你有一个类的对象,CustomCache但你不知道K也不知道T类型(还)。在这一点上你只能说你只会把Objects 放进去。

于 2013-04-04T07:37:26.677 回答
1

无需尝试,我认为您可以使用通用辅助方法解决此类情况:

private <K, T> ICache<K, T> createCache)(org.infinispan.Cache<K, T> cache){
  return new CustomCache<K, T>(cache);
}
于 2013-04-04T08:32:13.180 回答