了解Java的varargs



给定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. 通过严格调用确定适用的匹配Arity方法
  2. 识别适用于松散调用的匹配Arity方法
  3. 识别变量Arity调用适用的方法

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

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

相关内容

  • 没有找到相关文章

最新更新