栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

没有传递参数或null时的Java 3点参数(varargs)行为

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

没有传递参数或null时的Java 3点参数(varargs)行为

问题是,如果我直接使用参数null调用testNull(),我会回来,但如果使用null调用callTestNull()调用了testNull(),它将告诉我参数不是null,而是空数组。

是。如果使用 编译时类型 为的参数调用它

String
,则编译器会知道它 不能
String[]
,因此会将其包装在字符串数组中。所以这:

String x = null;testNull(x);

等效于:

String x = null;testNull(new String[] { x });

在这一点上,(具有误导性的)

string
参数将具有非null值-相反,它将引用大小为1的数组,其唯一元素是null引用。

但是,当您

null
直接在方法调用中使用文字时,它可以直接转换为
String[]
,因此不执行任何包装。

从JLS第15.12.4.2节开始:

如果要调用的方法是可变Arity方法m,则它必须具有n> 0形式参数。对于某些T,m的最终形式参数必须具有T
[]类型,并且必须使用k≥0的实际参数表达式来调用m。

如果m用k≠n个实际参数表达式调用,或者m用k = n个实际参数表达式调用,并且第k个参数表达式 的类型与T []分配不兼容
,则参数列表(e1,…,en-1,en,…,ek)的计算方式就像(e1,…,en-1,new | T [] | {en,…
,ek}),其中| T [] | 表示T []的擦除(第4.6节)。

(强调我的。)

我强调的一点是为什么 在参数的编译时类型为而

String
不是null类型 时才 进行换行。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/431419.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号