我是Java泛型新手。我正在设计DAO层。我将JPA用于Spring。我有一个BaseDAO,它被所有其他DAO类扩展。
public abstract class BaseDAO<E, Id extends Serializable> implements IBaseDAO<E, Id> {
private Class<E> entityClass;
@PersistenceContext
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
@SuppressWarnings("unchecked")
public BaseDAO() {
ParameterizedType genericSuperclass = (ParameterizedType) getClass()
.getGenericSuperclass();
this.entityClass = (Class<E>) genericSuperclass
.getActualTypeArguments()[0];
}
@Override
public E create(E entity) {
entityManager.persist(entity);
return entity;
}
//Some more methods
@Override
public List<?> executeNativeQuery(String queryString,
Map<String, Object> param) {
//implementation goes here
return resultList;
}
}
我在向此类添加公共列表执行NativeQuery(String queryString, Map参数)时遇到问题。因为如果我必须在扩展BaseDAO的类A中使用此方法,我将不得不为Base Class指定类型参数“E”和“Id”。理想情况下,type参数应该是我们要对其进行db调用的实体类。但是由于此方法是本机查询方法,因此我不使用实体类。我如何处理这种情况?
编辑:假设下面是一个DAO类,它扩展了BaseDAO并使用ExecutentiveEquiry方法
公共类MyDAO扩展了BaseDAO{
public String myMethod(){
String query="select a1,a2,a3,b4 from A a, B b where a.pk=b.pk";
...
..
List<String> = executeNativeQuery(query, map, String.class);
...
..
}
}
如果我没有为BaseDAO指定类型参数,我仍然会遇到以下错误。
Java语言类不能转换为java。lang.reflect。组织的参数化类型。springframework。豆。工厂支持BeanDefinitionValueResolver。resolveReference(BeanDefinitionValueResolver.java:328)
应该为BaseDAO传递什么类型参数?
正如我所看到的,问题在下面一行的构造函数中。
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
您应该改用getGenericInterfaces()[0]
,因为BaseDAO
类不从任何对象扩展(因此您将对象作为父对象),而是实现了IBaseDAO。
您可以执行以下操作。
@Override
public <T> List<T> executeNativeQuery(String queryString,
Map<String, Object> param, Class<T> clazz) {
//implementation goes here
return resultList;
}
在第三个参数中,可以指定要使用的列表的类型。E、 g.<代码>列表
我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类
问题内容: 我有一个笼子课: 我试图在另一个类main方法中实例化Cage对象: 我收到错误:笼子是原始类型。泛型Cage的引用应参数化。我尝试了几个想法,但对这种棘手的语法感到困惑:o( 问题答案: 是通用类型,因此您需要指定一个类型参数,例如这样(假设有一个): 您可以使用任何扩展的类型(甚至是自身)。 如果省略type参数,那么在这种情况下最终得到的是。但是,即使这是您想要的,您仍应明确声明
问题内容: 我有以下课程(来自简单的Spring教程) 其中Validator类是Spring 2.5中的类。 如果我尝试向其中添加参数,则supports方法显示警告(Class是原始类型。对泛型类型Class的引用应进行参数化) 我收到以下错误: 关于这种类型的问题有很多线索,但是我想获得一个完整的答案并真正理解它,而不会用“隐藏”这个问题! 问题答案: 接口使用原始类型声明该方法。在这种情况
我想使用泛型类作为另一个泛型类的类型参数。 起初,我对类的定义是这样的: 然后我的需求发生了变化,我不得不为我的R类型使用包装器/持有者类 到目前为止,我的尝试:(给出编译时错误:
我有一个类
考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口