Предупреждение Eclipse: безопасность типов (Java Generics) - PullRequest
3 голосов
/ 28 августа 2011

У меня есть следующий код Hibernate:

List<Book> result;    

result = hibernateTemplate.execute(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException, SQLException {
            Query query = session.createQuery("SELECT DISTINCT b FROM Book as b LEFT JOIN FETCH b.authors");

            List list = query.list();

            return list;
        }
    });

Я получаю следующие предупреждения, начиная с hibernateTemplate.execute(...:

Multiple markers at this line
    - HibernateCallback is a raw type. References to generic type HibernateCallback<T> should be parameterized
    - Type safety: The expression of type new HibernateCallback(){} needs unchecked conversion to conform to HibernateCallback<Object>
    - Type safety: Unchecked invocation execute(new HibernateCallback(){}) of the generic method execute(HibernateCallback<T>) of type 
     HibernateTemplate
    - Type safety: The expression of type new HibernateCallback(){} needs unchecked conversion to conform to HibernateCallback<List<Book>>
    - Type safety: The expression of type List needs unchecked conversion to conform to List<Book>

Так что это действительно сложно.

Не могли бы вы объяснить

  1. Что видит компилятор в сравнении с тем, что он ожидает, и почему?

  2. Какой самый безопасный способ исправить эти предупреждения ... т.е. не с помощью @SuppressWarnings("unchecked")?

Я попробовал предложение, появившееся по следующей ссылке: https://forums.oracle.com/forums/thread.jspa?threadID=1182661 (второе предложение из трех, появившихся внизу страницы) .... однако оно не сработало.

Спасибо!

P.S. Я знаю, как решить другое предупреждение, которое я должен получить из-за List list = query.list();, поэтому я не упоминаю его в своем вопросе.

P.S-2 Согласно Eclipse, сигнатура метода: <Object> Object org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateCallback<Object> action) throws DataAccessException

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

Подпись этого класса HibernateCallback<T> и определяет метод T doInHibernate(Session), но вы не указываете параметр типа T - вот на что жалуется компилятор: он не уверенваш код на самом деле приводит к List<Book>, который вписывается в вашу result переменную.

Вы правы в том, что добавление @SuppressWarnings не очень хорошая идея (на самом деле оно не увеличиваетсявведите безопасность), попробуйте вместо этого:

List<Book> result = hibernateTemplate.execute(new HibernateCallback<List<Book>>() {
    public List<Book> doInHibernate(Session session) throws HibernateException, SQLException {
        Query query = session.createQuery("SELECT DISTINCT b FROM Book as b LEFT JOIN FETCH b.authors");

        List list = query.list();

        return list;
    }
});

Это устанавливает для параметра типа T ожидаемый тип результата List<Book>, в частности это означает:

  • new HibernateCallback<List<Book>>() вместо просто new HibernateCallback()
  • затем требуется public Object doInHibernate(Session ..., чтобы стать public List<Book> doInHibernate(Session ...

Это все еще оставляет непараметризованный List list = query.list();, который вы можете обработать в одномспособы описываются в Как избежать предупреждений о безопасности типов с результатами Hibernate HQL? (я бы лично предпочел упомянутый там подход приведения типов).

0 голосов
/ 28 августа 2011

Разве это не просто ...

new HibernateCallback<List>()...

Что, вероятно, означает, что тип возвращаемого метода будет List, а не Object.Хотя тогда вам тоже нужно указать тип списка?

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