了解Java的varargs

时间:2019-11-11 13:54:09

标签: java variadic-functions

鉴于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上复制的。

1 个答案:

答案 0 :(得分:3)

这是由于采用了determining method signature的3种方法:

  1. 确定严格调用所适用的匹配Arity方法
  2. 确定适用于宽松调用的匹配Arity方法
  3. 确定可变Arity调用适用的方法

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

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