Java:严格类型检查失败?

时间:2014-12-04 07:03:31

标签: java typechecking

假设我有两个类如下

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
}

声明

  1. a.setValue(b.getValue != null ? b.getValue : 0);工作正常,但

  2. a.setValue(0)不起作用我需要将值设置为0D才能使其正常工作。

  3. 为什么我不需要在第一种情况下写D0

2 个答案:

答案 0 :(得分:5)

怀疑问题是你有

setValue(Double value)

现在条件表达式(b.getValue() != null ? b.getValue() : 0)的类型为double,遵循JLS section 15.25.2的规则:

  

如果其中一个操作数的类型为T,其中TByteShortCharacter,另一个操作数为常量类型为int的表达式,其值可在类型U中表示,这是将取消装箱转换应用于T的结果,则条件表达式的类型为U

...这没关系,因为您随后使用setValue参数调用double,并且可以将其设置为Double

但是,当您尝试拨打setDouble(0)时,您尝试使用setValue参数调用int,并且无法加框{ {1}} ...因此错误,因此当您通过Double时成功。

请注意,您不需要方法调用等来演示这一点 - 这是一个简单的例子:

0D

答案 1 :(得分:1)

作为Jon答案的补充,我建议您在实际需要时使用字段,变量和参数类型的原始包装类型。

使用相应的基元类型通常更有效。并且有更少的“边缘情况”让你绊倒/使你的代码更加脆弱。

(其中一个边缘案例是==的语义是......非直观的。另一个是在原始类型不能/不能的情况下你可以得到神秘的NullPointerException不给你那个。)

相关问题