使用泛型DAO引来的一系列之泛型,Class类

在开发网站过程中就使用了泛型带来的好处..消除了DAO的重复.
原文:http://www.hibernate.org/328.html.

当然也没有多想就照着做了.减少了代码的重复何乐而不为呢.

知道里面的经典语句:
 this.clazz = ((Parameterized)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

这是得到那个参数化类型的.

也有过与别人一样的疑问,为什么不直接用getGenericIntergaces()来得到呢?
后来补了下泛型
Java中的泛型使用了擦除实现.
在泛型代码内部,无法获得任何有关泛型参数类型的信息
也就是说
List list = new ArrayList();
与
List<Integer> list = new ArrayList<Integer>();

在运行时是等价的.

参数类型不像基本类型那样有多态:
也就是说
List<Object> obj = new ArrayList<Integer>();

这样子是不对的.
在Thinking in java中也解答了这个问题:
在数组中为什么可以这样,而在泛型不能这样.
是由于在数组中有个ArraySortException运行异常.
而在泛型中没有这样类似的异常,只能在编译时就检查这种错误.
为什么泛型中不弄个运行异常支持下呢..
我想可能是因为泛型的出现就是为了解决类型安全,所以就不去设计这种异常.有了那样的异常不就还和过去一样了嘛.

----------------------------------------------------------------------
最近要修整网站,又看到了这个泛型DAO,又细细品味下.多了些问题
也看到了过去一篇帖子
http://www.iteye.com/topic/214658

为什么那条经典的语句写在了GenericDaoImp中也能得了参数类型信息.
根据理解应该也在具体的实现才可以啊.
在具体类的构造方法中,得到了超类,然后再得到参数类型.
但现在是写在了GenericDaoImp中也得到了.

其实关键是对getClass()方法的理解.
过去我一直认为这个方法是得到当前类的Class对象.
也就是说,过去认为GenericDaoImp中的getClass就是得到GenericDaoImp的Class

但是看下JDK API
引用

public final Class<?> getClass()
返回此 Object 的 运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。


其实在GenericDaoImp中的getClass就是得到的就是具体子类的Class.

基础太差了吧.....






你可能感兴趣的:(DAO,jdk,html,Hibernate)