gpt4 book ai didi

java - Java 7 中简化的 Varargs 方法调用

转载 作者:太空狗 更新时间:2023-10-29 22:45:48 25 4
gpt4 key购买 nike

在 Java 7 中,您可以选择放置一个 @SafeVarargs 注释来抑制在编译带有不可具体化的可变参数参数的方法时收到的警告。 Project Coin 的 proposal规定当方法确保只有与可变参数参数相同类型的元素存储在可变参数数组中时,应使用注释。

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

最佳答案

例如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]
}

通过使用@SafeVarargs 标记该方法,您向编译器保证您不会做那样顽皮的事情。


但是我们到底怎么才能在 [1] 处得到一个通用数组呢? Java 不允许创建泛型数组!

创建通用数组的唯一认可方式是调用可变参数方法

foo( list_int_1, list_int_2 )

那么调用者就无法访问该数组,调用者无论如何也不能执行 [2],无论 foo() 如何弄乱数组都没有关系。

但转念一想,它创建泛型数组的后门

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

List<String>[] array1 = newArray(10);

和通用数组文字

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

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

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

关于java - Java 7 中简化的 Varargs 方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com