为什么这个代码将值转换为double而不是float?



我有一个问题为什么这段代码打印的是YYZ10.0而不是XXZ10.0?第一个构造函数是A(int),然后内部语句返回false,所以9+1f应该跳转到A(float)构造函数,而不是跳转到A(double)。

public class Main {
public static void main(String[] args) {
System.out.print(new A(011).fun()[1]);
}
}
class A{
double value;
public A(int value){
this(value >> 2 == 1 ? value+1.0 : value+1f);
}
public A(float value){
System.out.print("XX");
this.value = value;
}
public A(double value){
System.out.print("YY");
this.value = value;
}
public Object[] fun(){
return new Object[]{new Object(), this};
}
public String toString(){
return "Z"+value;
}
}

如果一个方法有多个重载,Java会在编译时选择调用哪一个,而不是在运行时。在本例中,您通过this调用构造函数。在编译时,Java决定调用三个构造函数中的哪一个,您可以看到它必须是接受double的构造函数。

Java必须选择接受double的构造函数,不仅因为它可以处理doublefloat的情况,还因为没有float的情况。三元表达式只能有一种类型。有时不是double有时不是float;总是double

考虑这个语句:

____ result = value >> 2 == 1 ? value+1.0 : value+1f;

你会在空格中输入什么类型?没有办法写"有时double,有时float"。必须是double

修改这一行(在A(int)构造函数中):

this(value >> 2 == 1 ? value+1.0 : value+1f);

:

this(value >> 2 == 1 ? value+1f : value+1f);

它应该这样调用正确的构造函数。

最新更新