了解 Java 的可变参数

Understanding Java's varargs

给定 void foo(Boolean... bars) 函数,bars 的值的行为与它在以下函数调用中显然应该有的行为非常不同:

为什么调用 foo(null) 会产生 bars = null 而不是 Boolean[1] { null }? 这是在 Java 8.

上转载的

这是因为 determining method signature 的三阶段方法:

  1. 识别严格调用适用的匹配 Arity 方法
  2. 识别适用于松散调用的匹配 Arity 方法
  3. 识别变量 Arity 调用适用的方法

foo(null) 在阶段 1 中匹配,因为接受 Boolean[] 的方法允许单个空参数,因为您可以将 null 转换为 Boolean[] (或者,事实上,任何引用类型)。

foo(null, null) 在第 3 阶段匹配,因为那是匹配可变 arity 方法的时候。假设您没有 foo 的 2-arg 重载,在此之前无法匹配,因为匹配方法需要两个参数。