簡體   English   中英

類型轉換A <X,Y> 到A <Object,Object>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM