2016-11-15 16 views
0

我正在使用openJPA(有点旧版本1.2),我每次投出query.getResultList()都会收到警告。我用@SuppressWarnings("unchecked")中前行,所以我可以摆脱那个特定的警告,但是,当我需要在下面的示例返回喜欢清单,我不能这样做:类型不安全:未选中从Foo投射到酒吧。 JPA的东西

// @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抱怨我不应该将列表存储在变量中,而是立即返回。这里我最好的选择是什么?

+0

由于您从方法中返回值而未将其分配给第一个代码段,因此您必须将@SuppressWarnings添加到方法本身。你必须住在声纳违规或第一个代码片段中,“我不想这样做” –

+0

只是为了在声纳周围愚弄也有一个肮脏的解决方案(虽然我不建议这样做)。添加“result.size();”在返回结果以摆脱声纳违规之前。我建议坚持在方法级别注释的第一个片段。 –

+0

不声纳使用Checkstyle吗?您可以禁用checkstyle错误。 –

回答

0

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

有一个简单的解决方案来摆脱这一点 - 在新功能中将所有对象投射到所需的类型。要做到这一点,你必须现在什么课是 - 这样:

在新 List<T>

在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,你只需要改变的地图功能,以简单循环的推杆铸造结果

+0

.map()。collect会创建一个新的数组吗? – nacho4d

+0

'.collect(Collectors.toList())'将返回具有映射结果的'List '。把它看作某种'reduce()'方法 –

+0

是啊......我以为。我只是想投。如果我需要创建一个新数组来摆脱警告,那么我认为我应该在方法级别更喜欢@SuppressWarnings(“unchecked”)。 – nacho4d

相关问题