泛型在某些情况下却是很强大 如泛型Dao 提高coder们的生产率
但在某些情况下却得不到预期效果
什么时候呢? 看个例子吧
HibernateEntityCacheDao是一个泛型类,见附录
EntityCache也是一个泛型类 见附录
在实际使用时 如下
这时entityClass的类型是User,就是说E的实际类型能够获取
但是 实例化EntityCache时问题就来了,entityCache 中得到的E是Object 并不是期待的User
这难道是擦除法导致的?
[b]附录[/b]
EntityCache源代码
但在某些情况下却得不到预期效果
什么时候呢? 看个例子吧
HibernateEntityCacheDao是一个泛型类,见附录
EntityCache也是一个泛型类 见附录
在实际使用时 如下
HibernateEntityCacheDao dao = new HibernateEntityCacheDao<User, Long>;
这时entityClass的类型是User,就是说E的实际类型能够获取
但是 实例化EntityCache时问题就来了,entityCache 中得到的E是Object 并不是期待的User
entityCache = new EntityCache<E>();
这难道是擦除法导致的?
[b]附录[/b]
public class HibernateEntityCacheDao<E, ID extends Serializable> extends HibernateDaoSupportEx implements GenericDao<E, ID>{
protected final Log log = LogFactory.getLog(getClass());
private Class<E> entityClass;
private Class<ID> idClass;
/**
* 实体缓存
*/
private EntityCache<E> entityCache = null; //[color=red]这个地方使用了泛型[/color]
public HibernateEntityCacheDao(){
idClass = GenericsUtils.getSuperClassGenricType(getClass(), 1);
entityClass = GenericsUtils.getSuperClassGenricType(getClass());
entityCache = new EntityCache<E>();//CacheFactory.getEntityCache(entityClass);
entityListCache = CacheFactory.getEntityListCache(entityClass);
hashFieldCache = CacheFactory.getHashFieldCache(entityClass);
}
.....
}
EntityCache源代码
public class EntityCache<E> implements Cache{
private Map<String, E> entityMap = null;
private Class<E> entityClass;
public EntityCache() {
entityMap = new HashMap<String, E>();
entityClass = GenericsUtils.getSuperClassGenricType(getClass());
}
public EntityCache(int initialCapacity) {
entityMap = new HashMap<String, E>(initialCapacity);
entityClass = GenericsUtils.getSuperClassGenricType(getClass());
}
public void clear() {
entityMap.clear();
}
....
}