下面我的查询
方法有助于使用org.hibernate.Session
查询我的持久层。方法代码如下:
public class Persister{
public static <E> List<E> query(Class<E> c, E... exampleEntities){
try(Session session = openSession()){
final Criteria criteria = session.createCriteria(c);
for(E e : exampleEntities){
final Example example = Example.create(e);
criteria.add(example);
}
@SuppressWarnings("unchecked")
final List<E> list = criteria.list();
/*
* Empty loop technique ensures all elements in list are of type E
* otherwise a ClassCastException is thrown. Inspired by
* "Java Generics" section 8.2
*/
for(E e : list);
return list;
}
}
//other methods ommitted
}
它会发出以下警告:
Type safety: Potential heap pollution via varargs parameter exampleEntities
在这种情况下使用 @SafeVarargs
注释是否安全?
据我了解,只要我不使用 exampleEntities
初始化本地 Object[]
,就可以了。但这似乎不对。
此方法类似于方法 java.util.Collections.addAll
the Java Specification §9.6.3.7中提到,用 @SafeVarargs
注释。
This answer讨论了该警告,并表示一般来说以下代码是安全的:
@SafeVarargs
void foo(T... args) {
for (T x : args) {
// do stuff with x
}
}
但是我的查询
方法的形式如下:
<T> List<T> query(T... args) {
Foo foo = new Foo();
for (T x : args) {
foo.add(x);
}
return (List<T>) foo.list();
}
那么,是否存在 @SafeVarargs
注解不安全的情况?
最佳答案
是的,您可以使用@SafeVarargs
。是否可以使用@SafeVarargs
取决于您如何使用varargs参数exampleEntities
。如果您依赖其实际运行时类型为 E[]
,则不能使用 @SafeVarargs
,但如果您仅依赖其元素类型为 E
,则可以使用 @SafeVarargs
。
在这里,您只需迭代 exampleEntities
并从中获取 E
。这与 @SafeVarargs
一致。
关于java - 具有通用返回类型的 vararg 方法中的 @SafeVarargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35899483/