我正在尝试实施番石榴缓存。
我的缓存对象是:
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>
这是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());
}
});
答案 0 :(得分:3)
简短的回答是,您的Cache<String, MyObject> cache
不 Cache<Object, Object>
,因此您无法将其传递给需要Cache<Object, Object>
的构造函数。
这里的根本问题是Spring的GuavaCache
主要不是Guava Cache
的包装器,而是Spring Cache
接口的实现恰好由番石榴Cache
支持。
区别可能有点微妙,但重要的是你正在处理的契约是Spring Cache
,这个界面允许你使用任何Object
} s作为键和值 - 请参阅put(Object, Object)
。
因此,如果您想使用Spring GuavaCache
,则需要向其传递一个Guava Cache
对象,该对象允许任何Object
用于键和值。但是你的Cache<String, MyObject>
不允许这样做。
库没有被破坏,它以这种方式刻意编码,以阻止您将错误类型的缓存传递给构造函数,这就是您的代码无法编译的原因。
你已经看到你可以通过将缓存转换为原始的番石榴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());
}
});
}
答案 1 :(得分:-1)
由于你没有类型安全,我只会使用原始类型。
Cache cache = initCache();
new GuavaCache("guava_cache",cache);