【问题标题】:Does this function call itself or call the overload?这个函数是调用自身还是调用重载?
【发布时间】:2017-04-19 15:31:14
【问题描述】:

考虑两个重载:

public void add(Integer value)
{
    add(value == null ? null : value.doubleValue());        
}

public void add(Double value)
{
    // some code here
}

如果我使用Integernull 实例调用第一个,那么三元条件是否将重载调用为Double,还是调用自身?

在我的机器上,它调用Double 重载,但这是定义明确的Java 吗? JLS 对此有何评论?

【问题讨论】:

  • 您尝试过自己阅读 JLS 吗?在我看来,当 JLS 可以免费在线阅读以供自己阅读时,完全没有必要询问 JLS 的内容。因此,我建议您自己阅读 JLS 会收获颇丰。 @Fitzwilliam Bennet-Darcy
  • 自己试试吧!实践经验让您学得更快!

标签: java overloading


【解决方案1】:

是的,它定义得很清楚,它将调用Double 重载。它不能调用Integer 重载,因为没有从double(这是条件表达式的类型)到Integer 的隐式转换。

基本上,这有两部分是不相关的:

  • 从重载中调用该方法
  • 方法参数是条件表达式

所以如果你认为它是:

Double d = getSomeDoubleValueFromAnywhere();
add(d);

...您希望调用哪个方法?大概是 add(Double) 方法 - 所以这也是在你的情况下调用的方法。

棘手的部分是确定条件表达式的类型——是Double 还是double?我相信rules(很难理解,IMO)意味着它是Double,因为使用了null 文字(属于null 类型)。如果你有:

Double dv = null;
add(value == null ? dv : value.doubleValue()); 

...那么条件表达式类型将是double,如果value 曾经是null,您将得到NullPointerException,因为它会尝试将null 值拆箱。

【讨论】:

  • 非常感谢您的建议,并修复了我的许多错误之一。
  • @FitzwilliamBennet-Darcy:我的错误 - 这不是错误! (虽然也有类似的情况......我现在正试图记住确切的情况......)
  • 谢天谢地,我非常健忘。这是一个可爱的答案。
  • @MadPhysicist:我还在研究这个,因为不清楚条件表达式的类型实际上是double 还是Double
  • JLS中的Table 15.25-B表示条件表达式的类型实际上是lub(null,Double),其中lub是一些crazy incomprehensible thing from section 4.10.4
【解决方案2】:

我很确定这里已经问过这样的问题,但找不到。

不管怎样,

add(value == null ? null : value.doubleValue()); 调用add(Double value),这很容易通过尝试在没有第二种方法的情况下编译代码并在调试器中进行检查。

关于 JLS 怎么说:value == null ? null : value.doubleValue() 表达式的类型显然是Double,它是如何描述的here

【讨论】:

  • 这是一个密集的列表。感谢您的链接。
  • 你说类型是“显然double” - 我不确定。这也是我最初的想法,但是如果 Integer 值是空引用,那将给出NullPointerException,而这似乎不会发生。我还在研究这个。
  • 现在已经解决了,我很确定表达式的类型真的 Double而不是double
  • @JonSkeet 当然是 Double 由于自动装箱,这是我严重的错误打印,感谢您指出
【解决方案3】:

因为你使用的是.doubleValue(),所以即使是整数,还是会转换成double。因此调用重载 public void add(Double value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 2018-12-05
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多