Java 7中简化的Varargs方法调用

Java 7中简化的Varargs方法调用,java,generics,variadic-functions,java-7,Java,Generics,Variadic Functions,Java 7,在Java 7中,您可以选择放置@SafeVarargs注释,以抑制在编译带有不可修改的varargs参数的方法时收到的警告。ProjectCoin规定,当该方法确保varargs数组中只存储与varargs参数类型相同的元素时,应使用注释 非安全方法的示例是什么?例如,foo()是不安全的,它可能在数组中存储非T,从而导致[2]出现问题 <T extends List<?>> void foo(T... args) { List<String>[]

在Java 7中,您可以选择放置
@SafeVarargs
注释,以抑制在编译带有不可修改的varargs参数的方法时收到的警告。ProjectCoin规定,当该方法确保varargs数组中只存储与varargs参数类型相同的元素时,应使用注释

非安全方法的示例是什么?

例如,
foo()
是不安全的,它可能在数组中存储非T,从而导致[2]出现问题

<T extends List<?>> void foo(T... args)
{
    List<String>[] array2 = (List<String>[])args;
    array2[0] = a_list_of_string;
}

void test2()
{
    List<Integer>[] args = ...;   // [1]
    foo(args);
    Integer i = args[0].get(0);   // [2]
}
然后调用者无法访问该数组,调用者无论如何也无法执行[2],不管
foo()
如何干扰该数组

但是你再想想,它是创建通用数组的后门

@SafeVarargs
static <E> E[] newArray(int length, E... array)
{
    return Arrays.copyOf(array, length);
}

List<String>[] array1 = newArray(10);
@SafeVarargs
静态E[]新数组(整数长度,E…数组)
{
返回数组.copyOf(数组,长度);
}
列表[]数组1=newArray(10);
和泛型数组文字

@SafeVarargs
static <E> E[] array(E... array)
{
    return array;
}

List<String>[] array2 = array( list1, list2 );
@SafeVarargs
静态E[]数组(E…数组)
{
返回数组;
}
List[]array2=数组(list1,list2);

所以我们可以创建泛型数组。。。愚蠢的Java,试图阻止我们这样做。

您可以创建没有varargs方法的泛型数组,但您必须使用并强制转换它。谢谢你的全面回答。这不是一个真正的“简化”,而是一个改进的提示。我正在尝试这个例子,我发现使用和不使用@SafeVarargs的行为都没有变化。我仍然收到一条警告“类型安全:列表的通用数组…”
@SafeVarargs
static <E> E[] array(E... array)
{
    return array;
}

List<String>[] array2 = array( list1, list2 );