在下面的代码中
class Main {
void m1(double x){
System.out.println("double");
}
void m1(float x){
System.out.println("float");
}
void m1(long x){
System.out.println("long");
}
void m1(byte x){
System.out.println("byte");
}
void m1(short x){
System.out.println("short");
}
void m1(int x){
System.out.println("int");
}
public static void main(String[] args) {
Main m = new Main();
m.m1(1);
}
}
为什么输出的是“ int”而不是“ byte”或“ long”或“ short”或“ float”或“ double”?
如果通过从“字节”->“短”->“ int”->“长”->“浮点数”->“双精度”进行自动转换,那么输出应该打印“双精度”对吗?
(https://www.geeksforgeeks.org/type-conversion-java-examples/)
答案 0 :(得分:0)
Int文字(例如1
)是类型int
的表达式。
重载解析过程分多个阶段进行,寻找一种可以接受所传递类型的参数的方法。
依次应用这些阶段,直到找到匹配项为止。
由于m1
的重载占用int
,因此在阶段1中找到了匹配项,因此无需将该值转换为另一种类型。
答案 1 :(得分:0)
根据定义,该原始文字为int类型。任何不带小数点的数字文字,其类型都为 int ,除非您在其中输入l / L:1L
将其转换为长整数。没有1个“字节”文字,您必须去(byte) 1
才能到达那里。
编译器会寻找最合适的,并使用需要int的方法。
这就是全部。如果要查看其他方法的调用,请将该值强制转换为(long),或者开始使用1.0而不是1之类的值。
关于您的评论:自动主义仅在需要时加入。但在您的情况下:A)您使用的是 int 值B)有一种整数获取方法。编译器无缘无故将int转换为longs变成double!
答案 2 :(得分:0)
仅当方法接受的类型大于输入的类型时,才会发生自动转换。例如,如果您删除除void m1(..)
版本以外的所有long
函数。然后,您可以传入一个整数,该整数将自动加长。
在您的示例中,有一个接受整数的方法,因此java将改用该方法,并且不会扩展。