以下代码只使用空引用作为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
引用的字符串数组,与第一次调用不同。正确的答案是什么?
答案 0 :(得分:12)
在我看来,它被认为是一个带有null的字符串数组 与第一次电话不同的参考
完全。这就是发生的事情。
实际上,它只是precedence
:exact-match
,var-args
,boxing
和type-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
。