Eclipse警告:类型安全(Java Generics)

时间:2011-08-28 18:05:30

标签: java hibernate generics compiler-warnings

我有以下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")

  3. 我已尝试过以下链接中显示的提案: 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 个答案:

答案 0 :(得分:2)

该类的签名是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();,你可以用How to avoid type safety warnings with Hibernate HQL results?中描述的方式之一来处理(我个人更喜欢那里提到的强制助手方法)。

答案 1 :(得分:0)

不只是......

new HibernateCallback<List>()...

这可能意味着方法返回类型将是List而不是Object。虽然那时你还需要指定List类型吗?