Monday, September 10, 2012

Java: Generics dont keep it simple stupid

So I was playing around with generics (dont love them because of type erasure - class level is ok method level gets scary) the other day and here are some examples and lessons learned:

1) Method level generics with return types are harder than they look.
2) Wildcards and when to use them confuse me.
3) My code is ugly and I must be missing something but what - who knows.


What I wanted was a Singleton class with generic get and put methods (what you put in is what you get out) without the cast. Something that works a little like Collections.emptyList();


The map I was storing my generic stuff in  ignore the naming for now:

What I wanted to do is something like this:

CacheItem<AnItem>  someCacheItem  = new DateCacheItemImpl<AnItem>();

Cache.getInstance().register(NameCacheItem.class);
Cache.getInstance().put(someCacheItem);

CacheItem<AnotherItem>  anotherCacheItem  = Cache.getInstance().get();



private ConcurrentHashMap<String, CacheItem<? extends ParentItem>> cacheMap =
  new ConcurrentHashMap<String, CacheItem<? extends  Parent Item>>();

public <T extends CacheItem<? extends  ParentItem >> void put(T cacheInstance) {

    cacheMap.put(cacheInstance.getCacheKey(), cacheInstance);
}

public <T extends CacheItem<? extends  ParentItem>> T get(String cacheKey) {
    return (T)cacheMap.get(cacheKey);
}

    public <T extends CacheItem<? extends  ParentItem >> void registerCache(Class<T> clazz) {

        try {
            CacheItem<? extends  ParentItem  > cacheInstance = clazz.newInstance();
            put(cacheInstance);
        } catch (InstantiationException e) {
            LOGGER.warning("Unable to create cache " + clazz.getName());
        } catch (IllegalAccessException e) {
            LOGGER.warning("Unable to create cache " + clazz.getName());
        }
    }


Not exactly what I wanted, will update this post once I have a epiphany.

No comments:

Post a Comment