Varargs在Java中使用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); displays [null, null]表示str[0]=nullstr[1]=null

但后来调用temp(null); 导致抛出NullPointerException ,看起来str本身为null

如果它的类型转换为String类似于这个temp((String)null); ,它工作并显示[null]

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

在我看来,它被认为是一个带有空引用的字符串数组,它与第一次调用不同

究竟。 这就是发生的事情。

实际上,它只是关于以下precedence : – exact-matchvar-argsboxingtype-casting

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

完全匹配> Type-Cast>拳击> Var-args

因此,您可以看到, var-args具有最低优先级,而exact-match具有最高优先级。 这意味着,如果一个argument对于exact-matchgood-enough ,那么它将被视为这样。

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

然而,在null, nullnull, null情况下,它将被视为var-args two元素。 因为它不能成为value of reference