【问题标题】:How to initialize ehCache for list using generics ?如何使用泛型为列表初始化 ehCache?
【发布时间】:2019-05-30 09:45:03
【问题描述】:

我正在尝试实现 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;
    }
}

提前致谢。

【问题讨论】:

    标签: java spring caching ehcache ehcache-3


    【解决方案1】:

    这是一个通用的怪癖。没有干净的解决方案。基本上,只要你有类似于&lt;T&gt; T get(Class&lt;T&gt;) 的东西,你就注定要失败。不可能轻易做到List&lt;String&gt; 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;
    }
    

    【讨论】:

    • 当然有,为什么不像其他人(guice、jackson、jaxrs、guava 等)一样使用类型标记(“Gafter 的小工具”)?至少从 2006 年就已经解决了。
    • 出于多种原因,但我不是来这里发起 API 战争的。只是为了帮助那个人。
    • 哦,这不是一场火焰战争,而是一个诚实的问题。不同的 API 设计选择有很多很好的理由,这些理由应该被拥有。然而,这不是语言的错,因此对这一断言提出了挑战。
    • :-) 我见过使用它的框架。我不支持 Ehcache API。 JCache 也没有。 EasyMock 和 Mockito 不是。但我想了想。最后决定在打字时马虎,以使用户更容易。 TypeReference 强制周围有匿名内部类。由于缺少 RTTI,这是一个丑陋的解决方法。但我想我更喜欢 Java 让那些通过而没有警告。但我可以在很长一段时间内正确。
    • @Henri 是的,这就是为什么三天没有人回答它,我已经按照你的建议进行了。但是我在想JAVA还能把猫拉出来我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    相关资源
    最近更新 更多