使用泛型类作为java List的类型

时间:2016-11-22 09:52:18

标签: java generic-programming generic-list

我想在下面创建方法:

    @Override
public List<?> listerUser( Class<?> nomClass ) throws GestionExceptionsDAO {

    Object tableSQL;

    try {
       tableSQL = nomClass.newInstance();
    } catch ( InstantiationException e1 ) {
        e1.printStackTrace();
    } catch ( IllegalAccessException e1 ) {
        e1.printStackTrace();
    }

    List<tableSQL> listeUser;//Error : tableSQL cannot be resolved to a type

    Session session = sessionFactory.openSession();
    session.beginTransaction();
    Query requete = session.createQuery( REQUETE_LIST );
    requete.setParameter( REQUETE_LIST, tableSQL );

    try {
        listeUser = (List<tableSQL>) requete.getResultList();
    } catch ( NoResultException e ) {
        throw null;
    } catch ( Exception e ) {
        throw new GestionExceptionsDAO( e );
    } finally {
        session.close();
    }
    return listeUser;
}

我尝试做的是创建一个方法,该方法接受参数类名,并返回该类的对象列表。我认为这很简单,但我发现有些困难。非常感谢。

2 个答案:

答案 0 :(得分:3)

您不能使用对实例变量的引用来参数化泛型类型。

您可能正在寻找的习惯用法是泛型方法,它返回一个List参数化的给定Class参数的类型:

public <T>List<T> listerUser(Class<T> nomClass) {
    List<T> result = new ArrayList<>();
    // TODO populate the result based on your query 
    return result;
}

您还可以使用Textends关键字将super绑定到子级或给定类/接口的父级(包括上限/下限)。

例如,给定一个定义:

public <T extends CharSequence>List<T> listerUser( Class<T> nomClass )

调用可以是:

List<String> list = listerUser(String.class);

备注

  • 有关通用方法的文档here
  • 如果您打算使用反射来初始化T的新实例(例如T t = nomClass.newInstance();),则您需要抛出或处理IllegalAccessExceptionInstantiationException

答案 1 :(得分:2)

您可以在参数类型和返回的类型对象中使用相同的通用参数化类型:

   public <T> List<T> listerUser( Class<T> nomClass ) throws GestionExceptionsDAO 

你可以这样打电话之后:

List<String> listerUser = listerUser(String.class);