[英]Find Sum of array passed as variable arguments (varargs) parameter then return result as an array in Java
[英]Java 3 dots parameter (varargs) behavior when passed no arguments or null
我试过这个并从JAVA得到奇怪的行为,有人可以帮我解释一下吗?
boolean testNull(String... string) {
if(string == null) {
return true;
} else {
System.out.println(string.getClass());
return false;
}
}
boolean callTestNull(String s) {
return testNull(s);
}
然后我有测试用例:
@Test
public void test_cases() {
assertTrue(instance.testNull(null)); // NULL
assertFalse(instance.testNull()); // NOT NULL
assertFalse(instance.callTestNull(null)); // NOT NULL
}
现在的问题是,如果我叫testNull()
直接与参数null
,我会得到true
回来,但如果调用callTestNull()
与null
,这就要求testNull()
它告诉我该参数不为空,但空数组。
问题是如果我直接使用参数null调用testNull(),我将返回true,但如果使用null调用callTestNull()调用testNull(),它会告诉我参数不是null,而是空数组。
是。 如果使用带有编译时类型 String
的参数调用它,则编译器知道它不能是String[]
,因此它将其包装在字符串数组中。 所以这:
String x = null;
testNull(x);
相当于:
String x = null;
testNull(new String[] { x });
此时,(误导性命名的) string
参数将具有非空值 - 相反,它将引用大小为1的数组,其唯一元素是空引用。
但是,当您在方法调用中直接使用null
文本时,它可以直接转换为String[]
,因此不执行包装。
如果被调用的方法是变量arity方法m,则它必须具有n> 0个形式参数。 对于某些T,m的最终形式参数必然具有类型T [],并且必须使用k≥0个实际参数表达式来调用m。
如果使用k≠n实际参数表达式调用m,或者,如果使用k = n实际参数表达式调用m并且第k个参数表达式的类型不与T []赋值兼容 ,则参数列表(e1,...,en-1,en,...,ek)被评估为好像被写为(e1,...,en-1,new | T [] | {en,... ,ek}),其中| T [] | 表示T []的擦除(第4.6节)。
(强调我的。)
我强调的一点是,为什么只有当参数的编译时类型是String
而不是null类型时才会发生包装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.