上代码
DAO类的泛型方法
方法一
[code="java"]public T getByPK(Integer arg)
{
Class entityClass =(Class) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
return (T)this.getHibernateTemplate().get(entityClass, arg);
}[/code]
Service的调用报错
java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
方法二
[code="java"]public T getByPK(Class entityClass,Integer arg)
{
return (T)this.getHibernateTemplate().get(entityClass, arg);
}[/code]调用成功的
这方法有什么不一样吗?怎么调用?望高手详解。
这个问题是这样,let me tell you
我用List来举个例子
class ArrayList implement List{
T get(i)
}
使用的时候
l=new ArrayList() 等价于 new ArrayList()
l=new ArrayList();
这时T等价于MyObj
这个时候 l.get(i) 等价于 MyObj get(i)。
使用泛型的时候我们要让java知道泛型到底是什么型,像上面我们告诉他,泛型T是MyObj类型。在构造对象的时候告诉了java。
public T getByPK(Integer arg) ,这样的泛型是加在方法上的泛型。这个T没有在class上面定义,仅仅是针对这个方法的。所以必须在方法的参数中指明类型。
比如我写过这样的代码
T getParam(HttpRequest request,String name,T defaultValue){
v=request.getParam(name)
if v==null return defaultValue;
return convertTo(v,defaultValue.getClass());
}
T convertTo(String value,Class type){
Object result = ....
return (T) result;
}
understand?你必须告诉java,T是什么类型,getParma方法通过T defaultValue,用defaultValue的值,convertTo方法,用type的类型。而你的第一个方法getByPk(Integer arg)没有告诉。
泛型DAO设计:
GenericDao{
T getByPk(ID)
update(T)
save(T)
delete(T)
List findAll()
}
class MyDao extends GenericDao{
}
class MyDao2 extends GenericDao{
}
OK,结束了。