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);
}
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.
Comments
Post a Comment