簡體   English   中英

定義實現通用接口的通用類

[英]Defining a generic class which implements a generic interface

我有要求在哪里定義實現generic interfacegeneric class

這是我的自定義地圖界面:

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

但是,當我嘗試構建Cache時,會收到類似“ Cache是​​原始類型。應該對通用類型Cache的引用進行參數化”的警告。

創建自定義地圖的示例方法。

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

避免這種情況的一種方法就是簡單地使用@SuppressWarnings,但是我可以使用泛型來修復該問題。

使用<>運算符雖然可以解決此問題, 但我也需要使其與1.6兼容。

我會實現為

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

作為適配器模式

警告幾乎可以概括為:類Cache是泛型類型,這意味着它接受類型參數,但是您對名為jCacheCache對象的引用沒有這種類型參數。 您不僅應該在聲明中提供它們,還應該在初始化中提供它們,如下所示:

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

它基本上說您有一個CustomCache類的對象,但是您還不知道KT類型。 您現在只能說將Object放入其中。

無需嘗試,我認為您可以使用通用幫助程序方法解決此類情況:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM