Java @具有泛型返回类型的vararg方法中的SafeVarargs

Java @具有泛型返回类型的vararg方法中的SafeVarargs,java,hibernate,annotations,variadic-functions,type-safety,Java,Hibernate,Annotations,Variadic Functions,Type Safety,下面我的query方法使用org.hibernate.Session方便了对我的持久层的查询。以下是方法代码: public class Persister{ public static <E> List<E> query(Class<E> c, E... exampleEntities){ try(Session session = openSession()){ final Criteria criteri

下面我的
query
方法使用
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
}
但是我的
query
方法的形式如下:

<T> List<T> query(T... args) {
    Foo foo = new Foo();
    for (T x : args) {
        foo.add(x);
    }
    return (List<T>) foo.list();
}
列表查询(T…args){
Foo-Foo=新的Foo();
对于(tx:args){
foo.add(x);
}
return(List)foo.List();
}

那么,是否存在
@SafeVarargs
注释不安全的情况?

是的,您可以使用
@SafeVarargs
。是否可以使用
@SafeVarargs
取决于如何使用varargs参数
exampleEntities
。如果依赖其实际运行时类型为
E[]
,则不能使用
@SafeVarargs
,但如果仅依赖其元素类型为
E
,则可以使用
@SafeVarargs


在这里,您只需迭代
exampleEntities
并从中获得
E
。这与
@SafeVarargs
是的,您可以使用
@SafeVarargs
。是否可以使用
@SafeVarargs
取决于如何使用varargs参数
exampleEntities
。如果依赖其实际运行时类型为
E[]
,则不能使用
@SafeVarargs
,但如果仅依赖其元素类型为
E
,则可以使用
@SafeVarargs

在这里,您只需迭代
exampleEntities
并从中获得
E
。这与
@SafeVarargs
一致

<T> List<T> query(T... args) {
    Foo foo = new Foo();
    for (T x : args) {
        foo.add(x);
    }
    return (List<T>) foo.list();
}