我正在尝试实现Guava Cache。
我的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());
}
});发布于 2015-08-14 15:44:06
简而言之,您的Cache<String, MyObject> cache不是Cache<Object, Object>,因此不能将其传递给需要Cache<Object, Object>的构造函数。
这里的潜在问题是,Spring主要不是一个Guava Cache的包装器,而是一个由Guava Cache支持的Spring Cache接口的实现。
区别可能有点微妙,但重要的一点是,您正在处理的契约是Spring的Cache,并且此接口允许您使用任何Object作为键和值-请参见put(Object, Object)。
因此,如果您想使用Spring键和值,则需要向它传递一个Guava Cache对象,该对象允许任何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());
}
});
}发布于 2015-08-14 15:49:16
既然你不能保证类型安全,我就只使用原始类型。
Cache cache = initCache();
new GuavaCache("guava_cache",cache);https://stackoverflow.com/questions/32004560
复制相似问题