输入不安全:未选中从Foo转换为Bar。 JPA东西

时间:2016-11-15 16:26:41

标签: java jpa warnings openjpa type-safety

我正在使用openJPA(有点旧版本1.2),每次演员query.getResultList()时都会收到警告。我在上一行使用@SuppressWarnings("unchecked"),所以我可以摆脱那个特定的警告,但是当我需要返回列表时我不能这样做,如下例所示:

// @SuppressWarnings("unchecked") I DON'T WANT TO DO THIS HERE
public <T> List<T> findByQuery(String queryString) {
    myEntityManager.createQuery(queryString);
    @SuppressWarnings("unchecked") // I WANT TO DO IT HERE
    return (List<T>)query.getResultList();
}

我可以这样做:

    ...
    @SuppressWarnings("unchecked")
    List<T> result = query.getResultList();
    return result;
}

然后sonar抱怨我不应该将列表存储在变量中,而是立即返回它。我最好的选择是什么?

1 个答案:

答案 0 :(得分:0)

query.getResultList()返回List<Object>。你不想把它强制转换为List<T>但是java无法定义它是否可能 - 由于类型擦除它们在运行时没有区别。这就是你必须使用@SuppressWarnings("unchecked")的原因。

有一个简单的解决方案可以摆脱这种情况 - 在新功能中将所有对象强制转换为所需类型。要做到这一点,你现在必须上课 - 所以:

在java 8中

public <T> List<T> findByQuery(String queryString, Class<T> clazz) {
    myEntityManager.createQuery(queryString);
    return query
           .getResultList()
           .stream()
           .map(result -> clazz.cast(result))
           .collect(Collectors.toList());
}

在旧版本的java中,您只需将map函数更改为简单循环,将结果结果放入新List<T>