再鄙视一下泛型
泛型在某些情况下却是很强大 如泛型Dao 提高coder们的生产率
但在某些情况下却得不到预期效果
什么时候呢? 看个例子吧
HibernateEntityCacheDao是一个泛型类,见附录
EntityCache也是一个泛型类 见附录
在实际使用时 如下
HibernateEntityCacheDao dao = new HibernateEntityCacheDao<User, Long>;
这时entityClass的类型是User,就是说E的实际类型能够获取
但是 实例化EntityCache时问题就来了,entityCache 中得到的E是Object 并不是期待的User
entityCache = new EntityCache<E>();
这难道是擦除法导致的?
附录
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();}....} 1 楼 jianfeng008cn 2009-05-26 E 可以定义extends 通过 equals 可以区分 2 楼 alienj 2009-05-27 其实主要的还是在于一个安全机制