类型安全:从List转换为List<String>的未经检查的强制转换

13

我有一个方法,在其中将结果转换为(List<String>),但是我的eclipse仍然报错了!类型安全性:从List转换为List存在未经检查的强制类型转换

@Override
public List<String> getDevices(Long productId) {

        String queryString = "SELECT op.name FROM t_operation op WHERE op.discriminator = 'ANDROID' and PRODUCT =:productId ";

        try {
            Query query = getEntityManager().createQuery(queryString);
            query.setParameter("productId", productId);

            return (List<String> ) query.getResultList();


        } catch (RuntimeException re) {         
            throw re;
        }

    }

根据APIjava.util.List表示getResultList()函数的返回类型。 - Jordi Castilla
使用 @SuppressWarnings("unchecked")。 - Michal
4个回答

8
请不要使用@SuppressWarnings和类型转换,因为这些是容易出错的方式。请遵循以下类似问题的答案中给出的建议,使用TypedQueryhttps://dev59.com/umYr5IYBdhLWcg3waJdT#21354639
TypedQuery<SimpleEntity> q = 
    em.createQuery("select t from SimpleEntity t", SimpleEntity.class);

List<SimpleEntity> listOfSimpleEntities = q.getResultList();
for (SimpleEntity entity : listOfSimpleEntities) {
    // do something useful with entity;
}

7
在这种情况下,您可以使用类型为String的TypedQuery参数。因此,您需要的是:
TypedQuery<String> query = getEntityManager().createQuery(queryString, String.class); 

4

你会因为运行时类型检查强制转换而收到此警告。

即使您使用if(query.getResultList() instanceof List<?>),您仍将收到此警告,因此...

  • 使用@SuppressWarning("unchecked")或者
  • 使用泛型

你说的“使用泛型”是什么意思?List<String> 不就是泛型吗? - SpringLearner
你的方式被称为通配符,如果我没记错的话。 - SpringLearner
同意 https://dev59.com/I2Ml5IYBdhLWcg3wuY_K - Jordi Castilla

2

您可能想要使用这个特殊的技巧来返回正确的类型。它适用于任何类型的对象,因为String#valueOf(Object)存在。

try {
    Query query = getEntityManager().createQuery(queryString);
    query.setParameter("productId", productId);
    return query.getResultList().stream().map(String::valueOf).collect(Collectors.toList());
} catch (RuntimeException re) {         
    throw re;
}

2
为什么不直接使用TypedQuery呢? - JonK
@JonK 这也可能是一种解决方案。如果您知道如何操作,请随意编辑我的帖子。我知道大概是这样的:TypedQuery<String> query = ...createNamedQuery...,但我不确定。 - Yassin Hajaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接