[英]Defining a generic class which implements a generic interface
我有要求在哪里定義實現generic interface
的generic 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
是泛型類型,這意味着它接受類型參數,但是您對名為jCache
的Cache
對象的引用沒有這種類型參數。 您不僅應該在聲明中提供它們,還應該在初始化中提供它們,如下所示:
cache = new CustomCache<Object, Object>(jCache);
它基本上說您有一個CustomCache
類的對象,但是您還不知道K
和T
類型。 您現在只能說將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.