定义实现通用接口的泛型类

时间:2013-04-04 07:29:17

标签: java generics

我要求我在哪里定义实现generic class的{​​{1}}。

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

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

但是当我尝试构建一个Cache时,我收到警告,例如“Cache是​​一个原始类型。对泛型类型Cache的引用应该参数化”......

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

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

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

使用&lt;&gt;运营商虽然解决了这个问题,但我也需要兼容1.6。

3 个答案:

答案 0 :(得分: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);
    }
}

它作为适配器模式

答案 1 :(得分:1)

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

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

它基本上表示您有一个类CustomCache的对象,但您不知道KT类型(尚未)。你现在可以说的是,你只会在其中放入Object

答案 2 :(得分:1)

没有尝试,我认为你可以使用通用的辅助方法解决这样的情况:

private <K, T> ICache<K, T> createCache)(org.infinispan.Cache<K, T> cache){
  return new CustomCache<K, T>(cache);
}