我有这段代码:
List<NumericConfig> results = null;
@SuppressWarnings("unchecked")
results = query.getResultList(); // query is JPA named query
但是我收到了这个错误:
结果未被识别为有效类型
但是此代码有效:
@SuppressWarnings("unchecked")
List<NumericConfig> results = query.getResultList(); // query is JPA named query
为什么我的第一个代码不起作用?
答案 0 :(得分:4)
注释如
@SuppressWarnings("unchecked")
只能应用于包,类,类成员(包括enum
值)或变量声明。它们不能适用于任意陈述。
注释可用作任何声明中的修饰符,无论是包(第7.4节),类(第8节),接口,字段(第8.3节,第9.3节),方法(第8.4节,第9.4节),参数,构造函数( §8.8),或局部变量(§14.4)。
由于它出现在方法体内,因此编译器已经排除了(包,类,成员)声明,因此需要在它之后进行变量声明。变量声明以一个类型开头,因此它将results
解释为类型名称,然后在意识到= query...
不是有效的变量名和初始化程序之前意识到它并且抱怨它。
我认为
List<NumericConfig> results
应该是
List<? extends NumericConfig> results
因为您可能不知道查询使用的确切实现类型,并且无论如何都无法有效地添加到结果列表中。
我不会将注释添加到整个方法中,因为这可能会抑制您(或后来的代码维护者)不确定安全的其他未经检查的分配。
您可以将作业拆分为两个
// This is type-safe because query is known to be a JPA named query.
// We use ? extends because query may be a more specific concrete type,
// and because we cannot add to the list owned by query.
@SuppressWarnings("unchecked")
List<? extends NumericConfig> resultListTyped = query.getResultList();
results = resultListTyped;
或者,根据我的偏好,您可以将注释附加到静态方法
results = unpackResultList(query, NumericConfig.class);
和其他地方
@SuppressWarnings("unchecked")
private static <T>
List<? extends T> unpackResultList(Query query, Class<T> resultType) {
List<T> results = query.getResultList();
// A quick and dirty sanity check of just the first value.
assert results.isEmpty() || resultType.isInstance(results.get(0));
return results;
}
后一种选择的好处还在于使用Java 5。