将Double声明为int compile vs not compile但看起来相同

Dan*_*son 4 java

(注意:Double只是一个例子)

初始化Double时,它需要Double或double作为值:

Double a = 0; //does not compile
Run Code Online (Sandbox Code Playgroud)

除非你加倍,否则追加'd'

Double b = (double)0; //compiles
Double c = 0d; //compiles
Run Code Online (Sandbox Code Playgroud)

当它变得令人困惑的是...
这个编译,虽然它的值变为0(int)

Double d = true ? 0 : 0d; //compiles, but always 0 (eclipse 'complains' on 0d calling it *Dead code*. So it knows it will return 0
Run Code Online (Sandbox Code Playgroud)

就像这样

Double e = false ? 0 : 0d; //compiles, always 0d
Run Code Online (Sandbox Code Playgroud)

但这些不编译:

Double f = false ? 0 : 0; //cannot convert from int to Double
Double g = true ? 0 : 0; //cannot convert from int to Double
Run Code Online (Sandbox Code Playgroud)

为什么给出fg的错误而不是d

PS.使用Java8(期望没有区别,但升级发生)

Adr*_*tti 5

它编译是因为根据Java规范(见§15.25),如果操作数具有不同的类型并且它们可以转换为数字类型,则应用二进制数字推广(在§5.6.2):

应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

 如果任一操作数的类型为double,则另一个操作数转换为double.

如果double是第一个或第二个操作数并不重要,结果将是double.

回到你的例子:

Double e = false ? 0 : 0d; 
Double a = true ? 0 : 0d;
Run Code Online (Sandbox Code Playgroud)

由于数字促销,它们都被转换为双倍但是这样:

Double f = false ? 0 : 0;
Run Code Online (Sandbox Code Playgroud)

它会失败,因为结果condition ? 0 : 0总是一个整数,从§15.25我们知道:

如果第二个和第三个操作数具有相同的类型(可以是null类型),那么这就是条件表达式的类型.

并且分配无效.请注意,这个确切的情况在规范中用于说明适用于§5.6.2-1的三元运算符的数字推广:

class Test {
    public static void main(String[] args) {
        int i = 0;
        float f = 1.0f;

        // Omitted code...

        // Here int:float is promoted to float:float:
        f = (b==0) ? i : 4.0f;
        System.out.println(1.0/f);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后请注意,您所需的最终类型(将使用一个三元运算符表达式vs)在此游戏中不起作用,并且此代码无法编译:

int n = true ? 0 : 0d; // Cannot assign a double to an int
Run Code Online (Sandbox Code Playgroud)