我是一条越来越黄的线下面的线:
return (List<HealthEntity>) criteria.list();
在下面的代码示例中。警告说:
类型安全:从列表到列表的未选中转换
并建议我使用@SupressWarnings 'unchecked'的方法。
public List<HealthEntity> findByCustomerIds(List<Long> customerId) {
Criteria criteria = getSession().createCriteria(getPersistentClass());
criteria.add(Restrictions.in("customerId", customerId));
if (customerId != null && !customerId.isEmpty()) {
return (List<HealthEntity>) criteria.list();
} else {
return new ArrayList<>(1);
}
}
这是返回实体列表的正确方法吗?还是我犯了任何错误?我应该使用@SuppressWarnings吗?
2条答案
按热度按时间whlutmcx1#
请思考5分钟,并告诉我,下面的代码类型安全吗?
五分钟后。
狗不安全,因为狮子关在笼子里。
由于使用了原始类型(
List
),泛型特性丢失,并且无法在编译时检查。错误将留在代码中,并在运行时泄漏(即狗被狮子吃掉)当您可以确保集合中的数据是安全的时,就可以使用
@SupressWarnings
来忽略编译时检查。例如,如果您的
getCage
方法是这样写的,您可以保证类型安全对于你的代码,我认为它是安全的。只需使用
@SupressWarnings
来忽略编译时检查。createCriteria(getPersistentClass())
方法应该保证这一点。前提是getPersistentClass()
的返回值为HealthEntity.class
mdfafbf12#
真的没有别的好办法可以解决这个问题。您无法执行
instanceof
检查,因为类型擦除并且Criteria#list()
的签名使用原始类型。您唯一能做的就是对结果列表中的每个项目运行instanceof
检查,但是在这种情况下,信任框架只返回符合您条件的对象是合理的。此外,检查每个项目仍然不会摆脱unchecked
警告。所以@SuppressWarnings
是正确的。