将A <x,y>转换为A <object,object>

时间:2015-08-14 07:27:39

标签: java spring generics casting guava

我正在尝试实施番石榴缓存。

我的缓存对象是:

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());
                    }
                });

2 个答案:

答案 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);