Java中带有空参数的可变参数(Varargs)

8
以下代码仅仅使用了一个空引用作为可变参数。
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]=nullstr[1]=null
但是后面对 temp(null); 的调用导致抛出了 NullPointerException,这表明 str 本身为 null
如果将其强制转换为 String 类型,类似于这样的语句 temp((String)null);,它就可以正常运行并显示 [null]
为什么在最后一个调用中需要显式类型转换?我认为这被视为具有 null 引用的字符串数组,这与第一次调用不同。正确答案是什么?
1个回答

12
看起来它被认为是一个带有空引用的字符串数组,这与第一次调用不同。
确实。就是这样发生的。
实际上,这只涉及到“优先级”之间的区别: - “精确匹配”,“变量参数”,“装箱”和“类型转换”。
编译器在检查要调用的方法或如何传递参数时遵循以下优先级:-
精确匹配>类型转换>装箱>变量参数
因此,您可以看到,“变量参数”具有最低的优先级,而“精确匹配”具有最高的优先级。这意味着,如果一个参数对于“精确匹配”已经足够好了,那么它将被视为这样做。
现在,当您将null作为参数传递时,null可以直接作为引用值传递给var-args参数。它是该参数的“精确匹配”。因此,您需要将其显式地强制转换为String,以说明它实际上是您的var-args参数的第一个元素。
而在null、null的情况下,它将被视为您的var-args的两个元素。因为它不能是引用值。

Arrays.asList(str); 构造了一个 java.util.List,其中包含一个 null 条目。String str = null; 与正在创建的 List 的引用没有任何关系(该引用不为 null)。 - Tiny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接