Java中带有空参数的Varargs
下面的代码只是将null引用用作varargs参数Java中带有空参数的Varargs,java,variadic-functions,Java,Variadic Functions,下面的代码只是将null引用用作varargs参数 package currenttime; import java.util.Arrays; public class Main { private static void temp(String...str) { System.out.println(Arrays.asList(str)); } public static void main(String[] args) {
package currenttime;
import java.util.Arrays;
public class Main
{
private static void temp(String...str)
{
System.out.println(Arrays.asList(str));
}
public static void main(String[] args)
{
temp(null,null);
temp(null);
}
}
第一次调用方法temp(null,null)
显示[null,null]
表示str[0]=null
和str[1]=null
但是后面调用temp(null)
导致抛出NullPointerException
,这表明str
本身是null
如果类型转换为String
类似的temp((String)null)代码>,它工作并显示[null]
为什么在最后一次调用中需要显式类型转换?在我看来,它被认为是一个带有null
引用的字符串数组,这与第一次调用不同。正确答案是什么
在我看来,它被认为是一个带有null的字符串数组
与第一次调用不同的引用
没错。这就是正在发生的事情
实际上,它只是介于:-精确匹配
,变量args
,装箱
和类型转换
之间
检查要调用的方法或参数的传递方式时,编译器遵循以下优先级:-
精确匹配>类型转换>装箱>变量参数
因此,您可以看到,var args
具有最低的优先级,exact match
具有最高的优先级。这意味着,如果一个参数
对于一个精确匹配
来说足够好
,那么它将被认为是这样的
现在,当您将null
作为参数传递时,null
可以直接作为引用的值传递给var args
参数。这是参数的精确匹配。
因此,您需要将typecast
显式地转换为String
,以告知它实际上是var args
参数的第一个元素
然而,如果null,null
,它将被视为变量args
的两个元素。因为它不能是参考值
Arrays.asList(str)
构造一个java.util.List
,其中包含一个null
条目<代码>字符串str=null代码>与正在创建的列表的引用无关(该列表不是null
)。