通用映射参数java

时间:2017-08-20 04:39:28

标签: java generics

我有很多这种类型的方法:

public static List<EduUsers> getDetails(Class c, Map<String, Integer> params) {
        List<EduUsers> details = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(c);
            for (Map.Entry<String, Integer> entry : params.entrySet()) {
                cr.add(Restrictions.eq(entry.getKey(), entry.getValue()));
            }
            details = cr.list();
            tx.commit();
        } catch (Exception asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.commit();
            }
        } finally {
            session.close();
        }
        return details;
    }

我正在尝试为它们设置一个通用的方法,这是我到目前为止所写的:

 public static <T> List<T> getDetails(Class<T> c, Class<T> b) {
        List<T> details = null;
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try {
            tx = session.beginTransaction();
            Criteria cr = session.createCriteria(c);
            //am stuck on iteration of the map from Class T b
            details = cr.list();
            tx.commit();
        } catch (Exception asd) {
            log.debug(asd.getMessage());
            if (tx != null) {
                tx.rollback();
            }
        } finally {
            session.close();
        }
        return details;
    }

如何在方法上设置通用Map?

编辑:我的地图值类型可以更改我需要能够不仅放置整数而且放置字符串以及其他类型

2 个答案:

答案 0 :(得分:1)

要使用通用地图,您应该定义方法,以允许任何类型的对象的地图传递到地图位置。

您的新方法应如下getDetails(Class<T> c,Map<String,?> params)

和Map Entry迭代器应如下所示:

for (Map.Entry<String, Object> entry : params.entrySet()) {
                cr.add(Restrictions.eq(entry.getKey(), entry.getValue()));
 }

答案 1 :(得分:1)

就像在方法的参数列表中添加Map<? extends Object, ? extends Object>一样简单。

public static<T> List<T> getDetails(Class<T> c, Map<? extends Object, ? extends Object> params)

另一种选择是添加另外两种参数类型:

private static <T, S, X> List<T> getDetails(Class<T> clazz, Map<S, X> map) {
    ...
    for (Map.Entry<S, X> entry : params.entrySet()) {
            cr.add(Restrictions.eq(entry.getKey(), entry.getValue()));
     }
    ...
  }

新参数Class<T> b可以删除,因为它没有在任何地方使用过。