考虑两个重载:
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对此有何看法?
答案 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()
。