关于java:定义实现通用接口的通用类

 2021-02-24 

Defining a generic class which implements a generic interface

我有要求在哪里定义实现generic interfacegeneric class

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

1
2
3
4
5
6
public interface ICache<K, T> {
     boolean containsKey(K k);
     T getValue (K key);
     void remove(K key);
     void put(K k, T t);
}

这是自定义类的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 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);
   }
}

但是当我尝试构建Cache时,会收到类似" Cache是??原始类型的警告。应该对通用类型Cache的引用进行参数设置" ...

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

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

避免这种情况的一种方法就是简单地使用@SuppressWarnings,但是我可以使用泛型来解决该问题。

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


我会将其实现为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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
2
3
private <K, T> ICache<K, T> createCache)(org.infinispan.Cache<K, T> cache){
  return new CustomCache<K, T>(cache);
}


警告几乎可以概括为:类Cache是泛型类型,这意味着它接受类型参数,但是您对称为jCacheCache对象的引用没有这种类型参数。您不仅应该在声明中提供它们,而且还应该在初始化中提供它们,例如:

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

它基本上说您有一个CustomCache类的对象,但是您不知道KT类型(尚未)。您现在只能说的是Object