【问题标题】:Understanding Java's varargs [duplicate]了解 Java 的可变参数 [重复]
【发布时间】:2020-03-07 05:18:25
【问题描述】:

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

【问题讨论】:

  • 我希望你能得到一个编译器警告。您可以将显式数组传递给 varargs 参数,对于 foo(null),它猜测您正在尝试这样做。

标签: java variadic-functions


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2010-12-16
    • 2019-02-04
    • 2014-06-22
    • 2017-01-07
    相关资源
    最近更新 更多