gpt4 book ai didi

java - 具有通用返回类型的 vararg 方法中的 @SafeVarargs

转载 作者:太空宇宙 更新时间:2023-11-04 12:50:16 25 4
gpt4 key购买 nike

下面我的查询方法有助于使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com