Как инициализировать ehCache для списка, используя дженерики? - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь реализовать 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;
    }
}

Заранее спасибо.

1 Ответ

0 голосов
/ 06 января 2019

Это общая причуда. Чистого решения не существует. По сути, как только у вас появляется что-то похожее на <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;
}
...