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]=null
且str[1]=null
。
但后来调用temp(null);
导致抛出NullPointerException
,看起来str
本身为null
。
如果它的类型转换为String
类似于这个temp((String)null);
,它工作并显示[null]
。
为什么在最后一次调用中,需要显式类型转换? 在我看来,它被认为是一个带有null
引用的字符串数组,它与第一次调用不同。 什么是正确的答案?
在我看来,它被认为是一个带有空引用的字符串数组,它与第一次调用不同
究竟。 这就是发生的事情。
实际上,它只是关于以下precedence
: – exact-match
, var-args
, boxing
和type-casting
。
在检查要调用的方法或参数的传递方式时,编译器遵循以下优先级: –
完全匹配> Type-Cast>拳击> Var-args
因此,您可以看到, var-args
具有最低优先级,而exact-match
具有最高优先级。 这意味着,如果一个argument
对于exact-match
是good-enough
,那么它将被视为这样。
现在,当您将null
作为参数传递时, null
可以直接作为value of reference
的value of reference
传递给var-args
参数。 它与参数exact match
。
因此,您需要将其明确地typecast
String
以告诉它实际上是var-args
参数的第一个元素
然而,在null, null
为null, null
情况下,它将被视为var-args
two
元素。 因为它不能成为value of reference
。