警告:[未选中]未经检查的转换

时间:2009-04-25 06:30:20

标签: java

我收到以下警告:

warning:[unchecked] unchecked conversion
[javac]found:java.util.List
[javac] required:java.util.List<edu.fullerton.cs476s09.espressobar.jpa.espressobar_milk>
return query.getResultList();

可能存在什么问题和可能的解决方案。 我使用以下代码:

@Stateless
@Remote(Order.class)
//@EntityListeners(MyListener.class)
public class OrderBean implements Order
{ 
    /**
     * The entity manager object, injected by the container
     */

    @PersistenceContext

    private EntityManager manager;

    public List<espressobar_milk> listMilk() 
    {
        Query query = manager.createQuery("SELECT m FROM espressobar_milk m");
        return query.getResultList();
    }...
.....
..}

提前感谢任何建议。

6 个答案:

答案 0 :(得分:11)

好吧,我们没有Query在这里的详细信息,但可能是getResultList方法返回原始List。基本上编译器不能确定getResultList返回的列表只包含espressobar_milk的实例(它稍微比它更微妙,但我们暂时将其保留在那里)。

您可以尝试强制键入,可能是通过更改Query类,或者您可以使用

注释方法
@SuppressWarnings("unchecked")

如果你确信它是正确的,但没有办法实现编译时的安全性。

答案 1 :(得分:10)

我正在使用EJB 3.1,我遇到了同样的问题。我找到了另一个解决方案:

TypedQuery<espressobar_milk> query = manager.createQuery("SELECT m FROM espressobar_milk m", espressobar_milk.class);         
return query.getResultList(); 

这解决了未经检查的对话警告(您不再需要@SuppressWarnings注释)。

答案 2 :(得分:3)

看起来你正在使用Hibernate,它正在实现JPA 1.0(希望Hibernate在发布时实现JPA 2.0。(Toplink目前是JPA 2.0的参考实现))。 Hibernate没有使用任何java 1.5功能,因此没有可用的泛型集合。

答案 3 :(得分:2)

可能是

的结果
return query.getResultList();

List而不是List< E >,正如预期的那样(List< espressobar_milk >)。 [http://java.sun.com/j2se/1.5.0/docs/api/java/util/List.html]这就是它显示警告的原因。在任何情况下,您都可以使用以下方法禁止此警告:

@SuppressWarnings ( "unchecked" )
public List<espressobar_milk> listMilk() 
{
    Query query = manager.createQuery("SELECT m FROM espressobar_milk m");
    return query.getResultList();
}

答案 4 :(得分:1)

未经检查的转换警告通常是由Java的Generics类型擦除机制引起的。这个想法是使用泛型的代码可以与不使用泛型的代码合作(事实上,生成的代码省略了泛型类型)。

但是,当您尝试将通用性“粘贴”到非泛型列表时,也会收到此警告(因为这与抛出ClassCastException的基于类的强制转换不同)。在这种情况下,尝试将牛奶类型添加到getResultList返回的非泛型列表中会产生错误。

阅读Java Generics tutorial了解更多信息。

答案 5 :(得分:1)

@SuppressWarning ( "unchecked" ) 

应该是:

@SuppressWarnings("unchecked")