问题

例如,我有这样的查询:

Query q = sess.createQuery("from Cat cat");
List cats = q.list();

如果我尝试做这样的事情,它将显示警告"类型安全:类型列表的表达式需要未经检查的转换以符合列表":

List<Cat> cats = q.list();

有没有办法避免它?


#1 热门回答(94 赞)

正如建议的那样,使用@SuppressWarnings是一个很好的方法,虽然它每次调用q.list()时都会涉及一些手指输入。

我建议还有其他三种技巧:
Collections.checkedList()
用这个替换你的作业:

List<Cat> cats = Collections.checkedList(q.list(), Cat.class);

你可能需要查看javadoc for that method,特别是关于equalshashCode
写一个cast-helper
只需将你所有的@SuppressWarnings重构为一个地方:

List<Cat> cats = MyHibernateUtils.listAndCast(q);

...

public static <T> List<T> listAndCast(Query q) {
    @SuppressWarnings("unchecked")
    List list = q.list();
    return list;
}

防止Eclipse为不可避免的问题生成警告

在Eclipse中,转到Window> Preferences> Java> Compiler> Errors / Warnings,在Generic type下,选中复选框Ignore unavoidable generic type problems due to raw APIs

这将关闭类似问题的不必要警告,例如上述不可避免的问题。

一些评论:

  • 我选择传入Query而不是q.list()的结果,因为这种"作弊"方法只能用于欺骗Hibernate,而不是用于欺骗任何List。
  • 你可以为.iterate()等添加类似的方法。

#2 热门回答(22 赞)

问题问题已经有很长一段时间了,但我希望我的回答可能会对像我这样的人有所帮助。

如果你看看javax.persistenceapi docs,你会看到自199888032以来已经添加了一些新的方法。其中一个是createQuery(String, Class<T>),返回TypedQuery<T>。你可以像使用Query一样使用TypedQuery,因为现在所有操作都是类型安全的小差别。

所以,只需将代码更改为smth,如下所示:

Query q = sess.createQuery("from Cat cat", Cat.class);
List<Cat> cats = q.list();

你们都准备好了。


#3 热门回答(21 赞)

我们很好地使用@SuppressWarnings("unchecked"),但我们通常只尝试在变量的声明上使用它,而不是整个方法:

public List<Cat> findAll() {
    Query q = sess.createQuery("from Cat cat");
    @SuppressWarnings("unchecked")
    List<Cat> cats = q.list();
    return cats;
}

原文链接