Как вызвать универсальный метод без параметров? - PullRequest
1 голос
/ 03 февраля 2012

Мне нужно написать общий метод Java, который не получает параметров и возвращает List. Этот универсальный метод используется в спящем режиме:

public <T> List list() {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    List result = session.createQuery("from " + T.class.getName()).list();
    return result;
}

Я пытаюсь вызвать этот метод. Я пробовал следующее, но это создает ошибки компиляции:

mgr.list<User>();
mgr.list()<User>;
mgr.list(<User>);

Как я могу вызвать этот метод?

Ответы [ 3 ]

7 голосов
/ 03 февраля 2012

Вы забыли это:

mgr.<User>list()
4 голосов
/ 03 февраля 2012

Я считаю, что то, что вы пытаетесь достичь, требует некоторого рефакторинга. Похоже, вы пытаетесь создать универсальный класс Dao, который вы можете использовать повторно для запроса любого объекта Model. Проблема в том, что, не передавая класс методу, вы не можете получить тип универсального <T> во время выполнения.

Один из способов выполнить то, что вы хотите, - создать базовый dao, который расширяется конкретными реализациями, которые знают класс, с которым они имеют дело во время компиляции.

public abstract class AbstractDao<T>{
  private Class<T> clazz;  
  public AbstractDao(Class<T> clazz){
     this.clazz = clazz;
  }


  public List<T> list() {
    Session session = HibernateUtil.getSessionFactory().getCurrentSession();
    List result = session.createQuery("from " + clazz.getName()).list();
    return (List<T>) result;
  }
}

Затем расширить класс:

class UserDao extends AbstractDao<User>{
   public UserDao(){
      super(User.class);
   }
}

Затем вызовите метод:

List<User> users = userDao.list();
1 голос
/ 03 февраля 2012

Это может быть связано с «стиранием типа» из-за использования обобщений. Когда вы звоните

T.class.getName()

этот тип T стирается перед выполнением. Он недоступен во время выполнения, он используется только во время компиляции для обеспечения безопасности типов. Вам, вероятно, нужно написать некоторый код, чтобы получить тип класса persitence во время выполнения, а затем использовать его в классе mgr. Пример

public abstract class GenericHibernateDAO<T, ID extends Serializable>
        implements GenericDAO<T, ID> {

    private Class<T> persistentClass;
    private Session session;

    public GenericHibernateDAO() {
        this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
                                .getGenericSuperclass()).getActualTypeArguments()[0];
     }

     // more methods


}

из https://community.jboss.org/wiki/GenericDataAccessObjects?_sscc=t

Здесь у него есть persistentClass, который устанавливается в тип параметра во время создания, тогда этот persistentClass находится в классе, когда это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...