了解 Java 的可变参数
Understanding Java's varargs
给定 void foo(Boolean... bars)
函数,bars
的值的行为与它在以下函数调用中显然应该有的行为非常不同:
- foo(),
bars = Boolean[0]
- foo(空),
bars = null
- foo(null, null),
bars = Boolean[2] { null, null }
为什么调用 foo(null) 会产生 bars = null
而不是 Boolean[1] { null }
?
这是在 Java 8.
上转载的
这是因为 determining method signature 的三阶段方法:
- 识别严格调用适用的匹配 Arity 方法
- 识别适用于松散调用的匹配 Arity 方法
- 识别变量 Arity 调用适用的方法
foo(null)
在阶段 1 中匹配,因为接受 Boolean[]
的方法允许单个空参数,因为您可以将 null
转换为 Boolean[]
(或者,事实上,任何引用类型)。
foo(null, null)
在第 3 阶段匹配,因为那是匹配可变 arity 方法的时候。假设您没有 foo
的 2-arg 重载,在此之前无法匹配,因为匹配方法需要两个参数。
给定 void foo(Boolean... bars)
函数,bars
的值的行为与它在以下函数调用中显然应该有的行为非常不同:
- foo(),
bars = Boolean[0]
- foo(空),
bars = null
- foo(null, null),
bars = Boolean[2] { null, null }
为什么调用 foo(null) 会产生 bars = null
而不是 Boolean[1] { null }
?
这是在 Java 8.
这是因为 determining method signature 的三阶段方法:
- 识别严格调用适用的匹配 Arity 方法
- 识别适用于松散调用的匹配 Arity 方法
- 识别变量 Arity 调用适用的方法
foo(null)
在阶段 1 中匹配,因为接受 Boolean[]
的方法允许单个空参数,因为您可以将 null
转换为 Boolean[]
(或者,事实上,任何引用类型)。
foo(null, null)
在第 3 阶段匹配,因为那是匹配可变 arity 方法的时候。假设您没有 foo
的 2-arg 重载,在此之前无法匹配,因为匹配方法需要两个参数。