Java中带有空参数的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) {

下面的代码只是将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)
    {
        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
)。