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();
}