了解Java的varargs [duplicate]

问题描述 投票:-1回答:1

此问题已经在这里有了答案:

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

java variadic-functions
1个回答
1
投票

这是由于determining method signature的三相方法:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.