【问题标题】:Why is f(Double x) a better match than f(double... x)? [duplicate]为什么 f(Double x) 比 f(double... x) 更匹配? [复制]
【发布时间】:2017-01-14 17:35:57
【问题描述】:

今天我正在准备即将到来的 Java 考试,我遇到了这个问题:

让A 是一个定义如下的类:

class A {
    public void f(Double x) { System.out.println("A.f(Double)"); }
    public void f(double... x) { System.out.println("A.f(double...)"); }
}

指令A a = new A(); a.f(1.0);产生的输出是什么?

答案似乎是A.f(Double),但我不明白为什么。谁能给我一个正确的解释?

【问题讨论】:

  • 产生的输出是您的团队负责人说“那是可怕的代码。找到一种编写它的方法,这并不意味着人们必须完全了解 Java 规范。”

标签: java


【解决方案1】:

重载决议总是偏爱具有显式参数数量的函数而不是具有可变参数列表的函数,即使这意味着 1.0 是自动装箱的。

更详细一点,根据JLS 15.12.2选择具有此优先级的函数:

  1. 类型加宽
  2. 自动装箱
  3. 变量参数

【讨论】:

  • 是的,在某些情况下确实很难看。在当前情况下,只有 f(new double[] {1.0}) 似乎有效。
  • (C++ 中的重载解析更加复杂 ;-))
  • @JörgWMittag:我觉得有趣的是,语言编写者甚至拒绝包含基于返回类型的简单形式的重载,因为那会“太难”,但随后他们加入了 NP-hard 解析规则用于参数重载。我不介意将重载标记为“主要”和“次要”的要求,每个参数签名只有一个“主要”重载。实现可以作为一个两步过程选择最佳参数签名,然后选择具有该签名的最佳重载(如果没有替代方案显然更好,则使用主要重载)。
猜你喜欢
  • 2015-08-10
  • 2013-09-01
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多