Java:严格类型检查失败?

eat*_*ode 0 java typechecking

假设我有两个类如下

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)

声明

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

  2. a.setValue(0)不起作用我需要设置值0D以使其工作.

为什么我不用写一个D随着0在第一种情况?

Jon*_*eet 5

怀疑问题是你得到的

setValue(Double value)
Run Code Online (Sandbox Code Playgroud)

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

如果操作数之一的类型为T,其中TByte,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)