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

时间:2017-04-19 15:31:15

标签: java overloading

考虑两个重载:

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

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

如果我使用null Integer实例调用第一个实例,那么三元条件是否会调用Double的过载,还是调用自身?

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

3 个答案:

答案 0 :(得分:21)

是的,已明确定义它将调用Double重载。它无法调用Integer重载,因为没有从double(这是条件表达式的类型)到{{1}的隐式转换}}

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

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

所以如果你把它想象成:

Integer

...您希望调用哪种方法?大概是Double d = getSomeDoubleValueFromAnywhere(); add(d); 方法 - 以便在您的情况下调用所谓的方法。

棘手的部分是计算出条件表达式的类型 - 是add(Double)还是Double?我认为rules(难以理解的,IMO)意味着它double,因为使用了Double字面值({{1} })。如果你有了:

null

...然后条件表达式类型为null,如果Double dv = null; add(value == null ? dv : value.doubleValue()); double,您将获得NullPointerException,因为它将是value尝试取消装箱null值。

答案 1 :(得分:3)

我很确定这里已经提出了这样的问题,但找不到它。

反正

add(value == null ? null : value.doubleValue());调用add(Double value),通过尝试使用第二种方法编译代码并在调试器中进行检查非常容易。

关于JLS对此的评价:表达式value == null ? null : value.doubleValue()的类型显然是Double,如何描述here

答案 2 :(得分:0)

因为您正在使用 ByteArrayOutputStream out = new ByteArrayOutputStream(); Writer w = OutputStreamWriter(out, "utf-8"); //write everything to the writer w.write(myString); byte[] bytes = out.toByteArray(); //now you have the actual size of the string, you can parcel by Mb. Be aware that problems may occur however if you have a multi-byte character separated into two locations ,即使它是一个整数,它仍然会转换为double。因此就是调用过载public void .doubleValue()