这个函数会调用自身还是调用重载?

Fit*_*rcy 11 java overloading

考虑两个重载:

public void add(Integer value)
{
    add(value == null ? null : value.doubleValue());        
}
Run Code Online (Sandbox Code Playgroud)

public void add(Double value)
{
    // some code here
}
Run Code Online (Sandbox Code Playgroud)

如果我用a的null实例调用第一个Integer,那么三元条件是否会调用a的重载Double,或者它是否调用自身?

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

Jon*_*eet 21

是的,很明确它会调用Double过载.它无法调用Integer重载,因为没有隐式转换double(这是条件表达式的类型)Integer.

基本上,这有两个部分是无关紧要的:

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

所以如果你认为它是:

Double d = getSomeDoubleValueFromAnywhere();
add(d);
Run Code Online (Sandbox Code Playgroud)

...你期望被称为哪种方法?大概是add(Double)方法 - 这就是你所处的情况.

棘手的部分是计算出条件表达式的类型 - 是Double或者double?我相信规则(很难遵循,IMO)意味着它是Double由于使用了一个null文字(属于这种null类型).相反,你有:

Double dv = null;
add(value == null ? dv : value.doubleValue()); 
Run Code Online (Sandbox Code Playgroud)

......那么条件表达式类型会double,你会得到一个NullPointerException,如果value是以往null,因为它会试图拆箱的null价值.