给定void foo(Boolean... bars)
函数,bars
的值在以下函数调用中的表现与明显的不同:
- foo((,
bars = Boolean[0]
- foo(null(,
bars = null
- foo(null,null(,
bars = Boolean[2] { null, null }
为什么调用foo(null(会产生bars = null
而不是Boolean[1] { null }
?这是在Java 8上复制的。
这是因为确定方法签名的三阶段方法:
- 通过严格调用确定适用的匹配Arity方法
- 识别适用于松散调用的匹配Arity方法
- 识别变量Arity调用适用的方法
foo(null)
在阶段1中匹配,因为接受Boolean[]
的方法允许使用单个null参数,因为您可以将null
强制转换为Boolean[]
(或者,实际上,任何引用类型(。
foo(null, null)
在第3阶段匹配,因为这是匹配可变arity方法的时候。假设您没有foo
的2-arg重载,则在此之前无法进行匹配,因为匹配方法需要两个参数。