2016-03-09 36 views
1

我的query方法使用org.hibernate.Session便于查询我的持久层。下面是该方法的代码:@SafeVarargs使用通用返回类型的可变参数法

它提出了以下警告:

类型的安全性:通过潜在的堆污染VARARGS参数exampleEntities

是否可以安全使用@SafeVarargs注解在这种情况下?

据我所知,只要我没有初始化本地Object[]exampleEntities,那么我没事。但这看起来不正确。

此方法类似于the Java Specification §9.6.3.7提到的方法java.util.Collections.addAll,其被注解为@SafeVarargsThis answer讨论了警告,他说,一般下面的代码是安全的:

@SafeVarargs 
void foo(T... args) { 
    for (T x : args) { 
     // do stuff with x 
    } 
} 

但我query方法的形式为:

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

那么,有没有的情况下@SafeVarargs注释会不安全?

回答

0

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

在这里,您只遍历exampleEntities并从中获得E。这与@SafeVarargs一致。