首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型转换为A<X、Y>到A<Object、Object>

类型转换为A<X、Y>到A<Object、Object>
EN

Stack Overflow用户
提问于 2015-08-14 15:27:39
回答 2查看 158关注 0票数 1

我正在尝试实现Guava Cache。

我的Cache对象是:

代码语言:javascript
复制
Cache<String,MyObject> cache = initCache();

GuavaCache构造函数看起来像这样:

代码语言:javascript
复制
GuavaCache(String name, com.google.common.cache.Cache<Object, Object>    cache)

执行此操作:

代码语言:javascript
复制
GuavaCache options = new GuavaCache("guava_cache",cache);

给出错误:

代码语言:javascript
复制
Cache<String,OptionMap> cannot be converted to Cache<Object,Object>

我试过<Object,Object> cache,但它不起作用。

缓存是一个接口:

代码语言:javascript
复制
public interface Cache<K, V>

GuavaCache:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/guava/GuavaCache.html

这就是initCache所做的:

代码语言:javascript
复制
return CacheBuilder.newBuilder()
                .expireAfterAccess(200, TimeUnit.SECONDS)
                .build(new CacheLoader<String, MyObject>() {
                    @Override
                    public MyObject load(String key) throws Exception {

                        return new MyObject(loadFromRedis());
                    }
                });
EN

回答 2

Stack Overflow用户

发布于 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来对其进行篡改,但是如果有人这样做了呢?

代码语言:javascript
复制
options.put("key","not a MyObject"); // appears to work fine

MyObject item = cache.get("key"); // throws a ClassCastException

如果你真的想使用GuavaCache,你应该尊重它的契约,并为它提供一个支持Cache中定义的操作的支持对象。例如:

代码语言:javascript
复制
Cache<Object, Object> cache;

代码语言:javascript
复制
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());
            }
        });
}
票数 3
EN

Stack Overflow用户

发布于 2015-08-14 15:49:16

既然你不能保证类型安全,我就只使用原始类型。

代码语言:javascript
复制
Cache cache = initCache();
new GuavaCache("guava_cache",cache);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32004560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档