(注意: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)
为什么给出f和g的错误而不是d
PS.使用Java8(期望没有区别,但升级发生)
它编译是因为根据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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |