Varargs在Java中使用null参数

时间:2012-10-13 04:43:01

标签: java variadic-functions

以下代码只使用空引用作为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]=nullstr[1]=null

但稍后调用temp(null);会导致NullPointerException被抛出,str本身就是null

如果它的类型转换为String类似temp((String)null);的类型,则会有效并显示[null]

为什么在最后一次调用中,需要显式类型转换? 在我看来,它被认为是一个带有null引用的字符串数组,与第一次调用不同。正确的答案是什么?

1 个答案:

答案 0 :(得分:12)

  

在我看来,它被认为是一个带有null的字符串数组   与第一次电话不同的参考

完全。这就是发生的事情。

实际上,它只是precedenceexact-matchvar-argsboxingtype-casting

编译器在检查要调用的方法或如何传递参数时遵循以下优先级: -

  

完全匹配> Type-Cast>拳击> VAR-ARGS

因此,您可以看到,var-args具有最低优先级,exact-match具有最高优先级。这意味着,如果argument的{​​{1}}为good-enough,则会将其视为exact-match

现在,当您将null作为参数传递时,null可以直接作为var-args传递到您的value of reference参数。参数为exact match 因此,您需要typecast明确指向String,告诉它实际上是您var-args参数的第一个元素

然而,如果是null, null,则会将其视为two的{​​{1}}元素。因为它不能是var-args