这是我的代码简单重载java中的代码。
public class Test {
static void test(float x){
System.out.print("float");
}
static void test(double x){
System.out.print("double");
}
public static void main(String[] args){
test(99.9);
test(99.9f);
test(99);
}
}
ans是
double
float
float
我知道为什么它会给出第一次和第二次通话的答案,但是对于第三次,它会调用浮动。为什么?如果有的话,请与一些知识链接分享答案。
答案 0 :(得分:2)
JLS 5.1.2涵盖了扩大规则https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.2
int to long,float或double
注意:float在double之前,如果你有一个方法,它会选择long
。
尽管int可能会失去精度转换为float而不是double。
答案 1 :(得分:2)
JLS §15.12.2.5. Choosing the Most Specific Method指定选择最合适方法的规则。相关部分(由我大胆突出):
如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符。 Java编程语言使用选择特定方法 的规则。
非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时错误的调用,那么一个方法比另一个方法更具体。
对于任何表达式,类型S 更具体而不是类型T,如果S<:T(§4.10)。
JLS §4.10.1. Subtyping among Primitive Types定义:
以下规则定义了基元类型之间的直接超类型关系:
double
> 1float
float
> 1long
long
> 1int
int
> 1char
int
> 1short
short
> 1byte
或者将它们链接起来,忽略char
,最右边是特定 :
double
> float
> long
> int
> short
> byte
因此,正如您所看到的, int
值,甚至是long
值,将在float
参数上选择double
参数强大的>,当时,正如JLS §5.1.2. Widening Primitive Conversion所说:
可能会导致从
int
到float
,或从long
到float
,或从long
到double
的扩展原始转换在精度损失中 - 也就是说,结果可能会丢失该值的一些最低有效位。