以下代码仅使用空引用作为可变参数参数。
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
and str[1]=null
.
但后来打电话给temp(null);
导致NullPointerException
被抛出,这似乎是str
本身就是null
.
如果它的类型转换为String
像这样的东西temp((String)null);
,它工作并显示[null]
.
为什么在最后一次调用中需要显式类型转换?在我看来,它被认为是一个带有null
与第一次调用不同的参考。正确答案是什么?
在我看来,它被认为是一个带有 null 的字符串数组
与第一次调用不同的参考
确切地。这就是正在发生的事情。
其实,这只是关于precedence
之间: -exact-match
, var-args
, boxing
and type-casting
.
编译器在检查要调用的方法或如何传递参数时遵循以下优先级:-
精确匹配 > 类型转换 > 拳击 > 可变参数
所以,你可以看到,var-args
具有最低的优先级,并且exact-match
具有最高优先级。这意味着,如果一个argument
is good-enough
for an exact-match
那么它将被视为这样。
现在,当你经过null
作为一个论证,那么null
可以直接传给你的var-args
参数为value of reference
。它是一个exact match
为参数。
所以,你需要typecast
它明确地String
告诉它实际上是你的第一个元素var-args
范围
然而,如果null, null
,它将被视为two
你的元素var-args
。因为它不可能是一个value of reference
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)