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

JBa*_*aba 1 java spring caching ehcache ehcache-3

我正在尝试实现 EhCache。

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

最初我尝试使用数组,但由于没有适用于数组类型的泛型 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Hen*_*nri 5

这是一个普遍的怪癖。没有干净的解决方案。基本上,一旦你遇到类似的事情,<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;
}
Run Code Online (Sandbox Code Playgroud)