假设我有两个类如下
class A
{
private Double value;
...
//getters and setters
}
class B
{
private Double value;
...
//getters and setters
}
更新
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
}
声明
a.setValue(b.getValue != null ? b.getValue : 0);
工作正常,但
a.setValue(0)
不起作用我需要将值设置为0D
才能使其正常工作。
为什么我不需要在第一种情况下写D
和0
?
答案 0 :(得分:5)
我怀疑问题是你有
setValue(Double value)
现在条件表达式(b.getValue() != null ? b.getValue() : 0
)的类型为double
,遵循JLS section 15.25.2的规则:
如果其中一个操作数的类型为
T
,其中T
为Byte
,Short
或Character
,另一个操作数为常量类型为int的表达式,其值可在类型U
中表示,这是将取消装箱转换应用于T
的结果,则条件表达式的类型为U
。
...这没关系,因为您随后使用setValue
参数调用double
,并且可以将其设置为Double
。
但是,当您尝试拨打setDouble(0)
时,您尝试使用setValue
参数调用int
,并且无法加框{ {1}} ...因此错误,因此当您通过Double
时成功。
请注意,您不需要方法调用等来演示这一点 - 这是一个简单的例子:
0D
答案 1 :(得分:1)
作为Jon答案的补充,我建议您仅在实际需要时使用字段,变量和参数类型的原始包装类型。
使用相应的基元类型通常更有效。并且有更少的“边缘情况”让你绊倒/使你的代码更加脆弱。
(其中一个边缘案例是==
的语义是......非直观的。另一个是在原始类型不能/不能的情况下你可以得到神秘的NullPointerException
不给你那个。)