[英]Typecasting A<X,Y> to A<Object,Object>
我正在嘗試實現Guava Cache。
我的緩存對象是:
Cache<String,MyObject> cache = initCache();
GuavaCache構造函數如下所示:
GuavaCache(String name, com.google.common.cache.Cache<Object, Object> cache)
這樣做:
GuavaCache options = new GuavaCache("guava_cache",cache);
給出錯誤:
Cache<String,OptionMap> cannot be converted to Cache<Object,Object>
我已經嘗試過<Object,Object> cache
但是它不起作用。
緩存是一個接口:
public interface Cache<K, V>
GuavaCache: http ://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/guava/GuavaCache.html
這是initCache的作用:
return CacheBuilder.newBuilder()
.expireAfterAccess(200, TimeUnit.SECONDS)
.build(new CacheLoader<String, MyObject>() {
@Override
public MyObject load(String key) throws Exception {
return new MyObject(loadFromRedis());
}
});
簡短的答案是您的Cache<String, MyObject> cache
不是 Cache<Object, Object>
,因此您不能將其傳遞給需要Cache<Object, Object>
的構造函數。
這里的根本問題是,Spring的GuavaCache
不是圍繞Guava Cache
的包裝器,而是Spring的Cache
接口的實現,而該接口恰好由Guava Cache
支持。
區別可能有些微妙,但重要的是要處理的協定是Spring的Cache
,並且此接口允許您將任何Object
用作鍵和值-請參見put(Object, Object)
。
因此,如果要使用Spring的GuavaCache
,則需要向其傳遞一個Guava Cache
對象,該Object
允許鍵和值的任何Object
。 但是您的Cache<String, MyObject>
不允許這樣做。 該庫沒有損壞,它是通過這種方式故意編碼的,以阻止您將錯誤類型的緩存傳遞給構造函數,這就是為什么您的代碼無法編譯的原因。
您已經看到可以通過將緩存轉換為原始的Guava Cache
來偽造它,但是如果有人這樣做,會發生什么呢?
options.put("key","not a MyObject"); // appears to work fine
MyObject item = cache.get("key"); // throws a ClassCastException
如果您確實想使用GuavaCache
,則應遵守其合同,並為其提供支持Cache
定義的操作的后備對象。 例如:
Cache<Object, Object> cache;
和
Cache<Object, Object> initCache() {
return CacheBuilder.newBuilder()
.expireAfterAccess(200, TimeUnit.SECONDS)
.build(new CacheLoader<Object, Object>() {
@Override
public Object load(Object key) throws Exception {
return new MyObject(loadFromRedis());
}
});
}
由於您沒有類型安全性,因此我只使用原始類型。
Cache cache = initCache();
new GuavaCache("guava_cache",cache);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.