泛型在某些情况下却是很强大 如泛型Dao 提高coder们的生产率
但在某些情况下却得不到预期效果
什么时候呢? 看个例子吧
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(); }....}