【问题标题】:how to apply Generics for the method which is not using type parameter of the class如何为不使用类的类型参数的方法应用泛型
【发布时间】:2012-08-28 18:16:00
【问题描述】:

我是 Java 泛型的新手。我正在设计我的 DAO 层。我在 Spring 中使用 JPA。我有一个由所有其他 DAO 类扩展的 BaseDAO。

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;
}

}

我在添加公共列表时遇到问题 executeNativeQuery(String queryString, 将 param) 映射到此类。因为如果我必须在扩展 BaseDAO 的类 A 中使用此方法,我将不得不为基类指定类型参数“E”和“Id”。理想情况下,类型参数应该是我们要进行 db 调用的实体类。但由于此方法是本机查询方法,因此我不使用实体类。我该如何处理这种情况?

编辑: 假设下面是扩展 BaseDAO 并使用 executeNativeQuery 方法的 DAO 类

公共类 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.lang.Class 不能在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) 处转换​​为 java.lang.reflect.ParameterizedType

应该为 BaseDAO 传递的类型参数应该是什么?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    您可以执行以下操作。

    @Override
    public <T> List<T> executeNativeQuery(String queryString,
            Map<String, Object> param, Class<T> clazz) {
    
    //implementation goes here
    
        return resultList;
    }
    

    在第三个参数中,您可以指定要使用的列表的类型。例如。 List&lt;SomeEntity&gt; result = executeNativeQuery("query", paramMap, SomeEntity.class).

    【讨论】:

      【解决方案2】:

      如我所见,问题出在下面一行的构造函数中。

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

      您应该改用getGenericInterfaces()[0],因为BaseDAO 类不会从任何东西扩展(因此您将Object 作为父类),而是实现IBaseDAO

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-07
        • 1970-01-01
        • 1970-01-01
        • 2015-12-26
        相关资源
        最近更新 更多