所以我基本上想知道,java会自动将int转换为double还是double转换为int。
为了更清楚地看一下这个例子: 说出这个标题的位置
public static void doThis (int n, double x)
在main方法中我们声明了这样的东西:
doThis(0.5,2);
这是无效通话吗?
怎么样?
doThis(3L,4);
这最后两个
doThis(3,4);
doThis(2.0,1.5);
由于
答案 0 :(得分:2)
int
类型的值可以隐式转换为double
,但反之亦然。
鉴于此声明:
public static void doThis (int n, double x)
这些是合法的:
doThis(1, 0.5); // call doThis with an int and a double
doThis(1, (double)2); // second int is converted to a double, then passed
doThis(1, 2); // same as above; the compiler automatically inserts the cast
doThis((int)3.5, 0.5); // first double is converted to an int, then passed
doThis((int)3.5, 42); // the double is converted to an int, and the int is converted to a double
而这些不是:
doThis(5.1, 0.5); // the compiler will not automatically convert double to int
doThis(5L, 0.5); // nor will it convert long to int
自动转换规则背后的意图是,如果这样做可能会丢失数据,编译器将不会自动转换类型。例如,(int)4.5
为4,而不是4.5 - 忽略小数部分。
答案 1 :(得分:1)
您可以传递int
字面值,其中需要双精度,但反之亦然。如果您尝试编译以下示例,则可以自己查看。
public class MWE{
public static void doThis (int n, double x) {
}
public static void main(String[] args) {
doThis(0.5,2); // Compiler error
doThis(3L,4);// Compiler error
doThis(3,4); // No Error
doThis(2.0,1.5); // Compiler error
}
}
答案 2 :(得分:1)
答案 3 :(得分:1)
传递不同类型的值时,有几条经验法则:
替换只是Java编译器的自动转换。您始终可以手动投射。
为了澄清,浮点类型为float
和double
,而整数类型为byte
,short
,int
和{{1 }}
在这种情况下,long
是一个浮点,double
是一个整数。您可以替换int
代替int
,但不能替代double
。
答案 4 :(得分:0)
在方法调用中,每个参数值都可以应用任何这些转换(JLS 5.3):
5.3。方法调用转换
方法调用上下文允许使用以下之一:
身份转换(第5.1.1节)
扩大基元转换(§5.1.2)
扩大参考转换(第5.1.5节)
拳击转换(§5.1.7),可选地后跟加宽引用 转化
取消装箱转换(第5.1.8节),可选地后跟加宽 原始转换。
在这个例子中,我们正在处理primitive widening conversion:
5.1.2。扩大原始转换
对原始类型的19个特定转换称为扩展 原始转换:
byte
至short
,int
,long
,float
或double
short
至int
,long
,float
或double
char
至int
,long
,float
或double
int
至long
,float
或double
long
至float
或double
float
至double
正如您在列表中看到的那样,从int
转到double
完全没问题,但事实恰恰相反。