假设我有两个类如下
class A
{
private Double value;
...
//getters and setters
}
class B
{
private Double value;
...
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
更新
public static void main(String[] args)
{
A a = new A();
B b = new B();
a.setValue(b.getValue() != null ? b.getValue() : 0); //works!
a.setValue(0); //doesn't work
}
Run Code Online (Sandbox Code Playgroud)
声明
a.setValue(b.getValue != null ? b.getValue : 0); 工作正常但是
a.setValue(0)不起作用我需要设置值0D以使其工作.
为什么我不用写一个D随着0在第一种情况?
我怀疑问题是你得到的
setValue(Double value)
Run Code Online (Sandbox Code Playgroud)
现在,条件表达式(b.getValue() != null ? b.getValue() : 0)的类型double遵循JLS第15.25.2节的规则:
如果操作数之一的类型为
T,其中T是Byte,Short,或Character,另一操作数是int类型,其值是在类型可表示的恒定表达U,其是施加解包转换到的结果T,那么条件表达式的类型是U.
......那没关系,因为你接着setValue用一个double参数打电话,这可以装箱Double.
但是,当你尝试打电话时,你试图用一个参数setDouble(0)进行调用,并且不能将其装箱...因此错误,因此当你通过时会成功.setValueintDouble0D
请注意,您不需要方法调用等来演示这一点 - 这是一个简单的示例:
Double x = 0d;
Double y = true ? x : 0; // Fine
Double z = 0; // Error
Run Code Online (Sandbox Code Playgroud)