当前位置: 首页 > 知识库问答 >
问题:

如何对不使用类的类型参数的方法应用泛型

孟修竹
2023-03-14

我是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传递什么类型参数?

共有2个答案

翟青青
2023-03-14

正如我所看到的,问题在下面一行的构造函数中。

ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();

您应该改用getGenericInterfaces()[0],因为BaseDAO类不从任何对象扩展(因此您将对象作为父对象),而是实现了IBaseDAO。

葛修永
2023-03-14

您可以执行以下操作。

@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继承的所有地方的使用情况(?)从。 但是,如果我将接口