有一段代码:
public class Main_num {
public static void num(Integer i) {
System.out.println("num(Integer)");
}
public static void num(short i) {
System.out.println("num(short)");
}
public static void num(long i) {
System.out.println("num(long)");
}
public static void num(Object i) {
System.out.println("num(Object)");
}
public static void num(int... i) {
System.out.println("num(int...)");
}
public static void main(String[] args) {
num(5);
}
启动后,会显示num(long)
.其余方法为什么不被调用是可以理解的,但对我来说并不明显为什么程序将数字 5 识别为 long 而不是 Short 并调用相应的方法 (num(long i)) 而不调用 num(short i) )。有人可以解释一下吗?
编译器会看到数字 5 的方法调用,与 Java 中的所有默认数字一样,它的类型为
int
。他明明适合long
,却又不适合short
。因此,该方法的版本被调用,专门针对long
.short
此外,如果将传递给该方法的数字显式转换为以下类型,则可能会导致 的重载:结果:
short
在这种情况下,编译器无法调用在传递时接受类型整数常量的重载方法int
,因为这可能会导致精度损失(int
“宽”的两倍short
)。由于采用原语的方法没有合适的变体
int
,因此编译器将首先寻找采用下一个合适的原语类型参数的方法,即long
。JLS 语言规范15.12.2 中描述了此逻辑。编译时步骤 2:确定方法签名:
在这种情况下,要使用类型参数调用重载变体,您必须调用方法,传递类型或 的
short
值:byte
short
即使调用带有类型参数的方法
char
也会导致类型扩展为long
,因为无符号 16 位字符不“适合”有符号short
。您还应该注意,当使用类型参数调用时,
Long
将调用所采用的方法的版本Object
- 这种具有共同祖先类型的方法比拆箱版本更合适: