依然是一个重载的问题,参考第五题
第五题是关于重载中参数个数不同时的匹配问题,,而这道题是重载方法中参数类型不同时的匹配问题
先看看程序的运行结果
Wrapper.java:10: 错误: 对于fun(int), 找不到合适的方法 fun(z); ^ 方法 Wrapper.fun(Long)不适用 (无法通过方法调用转换将实际参数int转换为Long) 方法 Wrapper.fun(Short)不适用 (无法通过方法调用转换将实际参数int转换为Short) 方法 Wrapper.fun(short)不适用 (无法通过方法调用转换将实际参数int转换为short)1 个错误
接下来分析问题的本源
看几个段代码
import java.util.*;public class Wrapper{public static void fun(int n){System.out.println("int");}public static void fun(Short n){System.out.println("SHORT");}public static void fun(Long n){System.out.println("LONG");}public static void main(String[] args){short y = 0;int z = y;fun(y);fun(z);}}运行结果:
int
int
short可以优先转型成int
import java.util.*;public class Wrapper{//public static void fun(int n){System.out.println("int");}public static void fun(Short n){System.out.println("SHORT");}public static void fun(Long n){System.out.println("LONG");}public static void main(String[] args){Integer y = 0;//int z = y;fun(y);//fun(z);}}~编译错误
是由于Integer不能转型成Long型
import java.util.*;public class Wrapper{//public static void fun(int n){System.out.println("int");}public static void fun(Short n){System.out.println("SHORT");}public static void fun(Long n){System.out.println("LONG");}public static void main(String[] args){int y = 0;//int z = y;fun(y);//fun(z);}}编译错误
int不能转成其他的封装类
结论
1、调用方法时,Java编译器会寻找最精却的匹配方法,如果无法判断哪个是最精却(歧义调用)的就会出现编译错误。
如:max(double,int)和max(int,double)
2、关于类型转换问题
a.char->int->long,short->int-long
b.基本数据类型->包装类
c.包装类之间不能转换
d.基本数据类型优先考虑转换成基本数据类型,如果没有,再考虑转成对应的包装类(只能是对应的,int不能转成Long)
他们的快乐像贪玩的小孩,游荡到天光却还不肯回来。