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

标签 java hibernate annotations variadic-functions type-safety

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

相关文章:

java 调试不能正确显示当前行

java - hibernate native 查询错误 : Column not found

java - JPA 惰性属性获取自定义属性

java - 使用 Hibernate 注释保留枚举属性的自定义值

java - @ManyToOne 属性上不允许使用 @Column(s)

java - Servlet 全局化 NumberFormat.getCurrencyInstance(Locale.JAPAN) 无法正常工作

java unmarshalling - NULL 值或缺少标记?

java - 没有附件的 SOAPMessage writeTo

java - Wildfly 和 MySQL 的不可重复读隔离级别

java - 库类中的枚举占位符