如何使用泛型为列表初始化 ehCache?
How to initialize ehCache for list using generics ?
我正在尝试实施 EhCache。
由于我的 CacheManger
class 设置使用泛型,因此我希望我的缓存管理器实例也是泛型。
最初我尝试使用数组,但由于没有适用于数组类型的泛型 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;
}
}
提前致谢。
这是一个普遍的怪癖。没有干净的解决方案。基本上,一旦你有类似于 <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;
}
我正在尝试实施 EhCache。
由于我的 CacheManger
class 设置使用泛型,因此我希望我的缓存管理器实例也是泛型。
最初我尝试使用数组,但由于没有适用于数组类型的泛型 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;
}
}
提前致谢。
这是一个普遍的怪癖。没有干净的解决方案。基本上,一旦你有类似于 <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;
}