Использование универсального класса в качестве типа списка 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);