Java中如何将MyClass.class作为方法参数传递并实现泛型复用?
正确实现泛型版的
selectAllFrom方法 我来帮你搞定这个泛型方法的问题~你想要遵循DRY原则避免重复写相似方法的思路完全没问题,只是现有代码里有几个泛型使用的小错误,调整一下就能实现你想要的效果:
先指出你代码里的问题
- 方法没有声明泛型参数
<T>,Java编译器不知道T是什么类型 CriteriaQuery<Class<T>>的类型写错了,你要的是映射到T类型,而不是Class<T>Class<T>.class这种写法是错误的,因为你传入的参数本身就是T的Class对象,直接用它就行
正确的实现代码
下面是修正后的完整泛型方法,我还补充了一些Hibernate查询的常规步骤,让代码更完整:
// 先给方法加上泛型声明<T>,放在方法返回值之前 private <T> List<T> selectAllFrom(Class<T> entityClass) { // 假设你已经有EntityManager实例(通常从容器注入或者手动创建) EntityManager em = getEntityManager(); CriteriaBuilder builder = em.getCriteriaBuilder(); // 这里直接用传入的entityClass作为createQuery的参数,泛型类型是<T> CriteriaQuery<T> query = builder.createQuery(entityClass); Root<T> root = query.from(entityClass); query.select(root); // 执行查询并返回结果列表 return em.createQuery(query).getResultList(); }
调用方式
和你预想的一样,直接传入实体类的.class对象就行:
// 查询MyClass的所有数据 List<MyClass> myClassList = selectAllFrom(MyClass.class); // 换其他实体类也一样 List<OtherClass> otherClassList = selectAllFrom(OtherClass.class);
关键知识点解释
- 泛型声明
<T>:必须放在方法的返回值类型之前,告诉编译器这是一个泛型方法,T是一个类型参数 Class<T>参数:这个参数是用来传递实体类的类型信息(因为Java的泛型是擦除式的,运行时需要显式的Class对象来做类型映射)CriteriaQuery<T>:这里的泛型T就是你要映射的实体类型,和传入的entityClass类型一致,Hibernate会把查询结果自动映射为T类型的对象
如果你的原方法只是示例,实际需要返回查询结果的话,上面的代码已经帮你改成返回List<T>了;要是确实不需要返回值,改成void并去掉return语句就行~
内容的提问来源于stack exchange,提问作者Miger
相关产品推荐
相关产品推荐

