weixin_42351653
2009-12-11 09:35
浏览 226
已采纳

泛型方法问题

上代码
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]调用成功的

这方法有什么不一样吗?怎么调用?望高手详解。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • iteye_19907 2009-12-11 13:17
    已采纳

    这个问题是这样,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,结束了。

    打赏 评论

相关推荐 更多相似问题