Использование универсального класса в качестве типа списка Java

Я хотел бы создать метод ниже:

    @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 ответа

Решение

Вы не можете использовать ссылку на переменную экземпляра для параметризации универсального типа.

Идиома, которую вы, вероятно, ищете, это универсальный метод, который возвращает 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;
}

Вы также можете связать T детям или родителям данного класса / интерфейса (включая верхние / нижние границы) с помощью extends или же super ключевые слова.

Например, дано определение:

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

Вызов может быть:

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

Заметки

  • Документы по общим методам здесь.
  • Если вы планируете использовать отражение для инициализации нового экземпляра T (например T t = nomClass.newInstance();), вам нужно будет бросить или обработать IllegalAccessException а также InstantiationException

Вы можете использовать тот же универсальный параметризованный тип в типе параметра и возвращенном объекте типа:

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

После того, как вы можете назвать это так:

List<String> listerUser = listerUser(String.class);
Другие вопросы по тегам