代码之家  ›  专栏  ›  技术社区  ›  JBaba

如何使用泛型初始化列表的ehcache?

  •  0
  • JBaba  · 技术社区  · 6 年前

    我正在尝试实现ehcache。

    作为我的设置 CacheManger 类使用泛型,因此我希望缓存管理器实例也是泛型。

    最初我尝试使用array,但由于array类型没有泛型sol,所以这一方法就走到了死胡同。

    如果有人能帮助我理解泛型是如何与列表一起工作的,那就太好了。

    我现在能想到的是 List.class 然后将类型转换为混凝土类型。但我很可能是错的,确实建议如果这种方法也可以改进。

    public class CacheManager<Dao extends DaoImpl,Pojo extends PozoImpl> {
    
        Class<Dao> clazz = null;
        Class<Pojo> _clazz_pojo = null;
        // < I tried Pojo[] instead of List but its not posibble with generics >
        Cache<String, List<Pojo>> _cache = null;
    
        // get cacheManager singleton obj
        public static CacheManager cacheManager = EhCacheInstance.ehInstance.getInstance();
    
        public CacheManager(Class<Dao> clazz,Class<Pojo> _clazz_pojo) {
            // get cache
            // < How do we init List here? >
            _cache = cacheManager.getCache(_clazz_pojo.getName(), String.class, ? ); 
    
            // init
            if(_cache == null){
                _cache = cacheManager.createCache(_clazz_cargo.getName(), 
                        CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, ? , ResourcePoolsBuilder.heap(10)));
            }
    
            // assigment
            this.clazz = clazz;
            this._clazz_cargo = _clazz_cargo;
        }
    }
    

    事先谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Henri    6 年前

    这是一种常见的怪癖。没有干净的溶液。基本上,只要你有类似的东西 <T> T get(Class<T>) 你是注定的。这是不可能的 List<String> s = get(List.class) 很容易。

    你需要在某个地方投射并抑制警告。在你的情况下,我可能会这样做:

    public CacheManager(Class<Dao> clazz, Class<Pojo> _clazz_pojo) {
        Class<List<Pojo>> valueClass = cast(List.class);
        _cache = cacheManager.getCache(_clazz_pojo.getName(), String.class, valueClass);
    
        if(_cache == null){
            _cache = cacheManager.createCache(_clazz_pojo.getName(),
                    CacheConfigurationBuilder.newCacheConfigurationBuilder(String.class, valueClass,
                            ResourcePoolsBuilder.heap(10)));
        }
    
        // ...
    }
    
    @SuppressWarnings("unchecked")
    private <T, V> Class<V> cast(Class<T> t) {
        return (Class<V>) t;
    }