Java中的重载方法之匹配优先级

来源:互联网 发布:java接收json对象 编辑:程序博客网 时间:2024/05/23 12:24

之前写过一篇关于重载方法的。
http://blog.csdn.net/uncle_gy/article/details/78006215

示例代码:

import java.io.Serializable;import java.lang.Comparable;public class Overload{    public static void sayHello(Object arg){        System.out.println("Hello Object");    }    public static void sayHello(byte arg){        System.out.println("Hello byte");    }     public static void sayHello(short arg){        System.out.println("Hello short");    }     public static void sayHello(char arg){        System.out.println("Hello char");    }     public static void sayHello(int arg){        System.out.println("Hello int");    }    public static void sayHello(long arg){        System.out.println("Hello long");    }    public static void sayHello(float arg){        System.out.println("Hello float");    }    public static void sayHello(double arg){        System.out.println("Hello double");    }    public static void sayHello(Character arg){        System.out.println("Hello Character");    }    public static void sayHello(char... arg){        System.out.println("Hello char...");    }    public static void sayHello(Serializable arg){        System.out.println("Hello Serializable");    }    public static void sayHello(Comparable<Character> arg){        System.out.println("Hello Comparable<Character>");    }    public static void main(String[]args){        sayHello('a');    }}

输出结果1:

此时输出结果是:Hello char
如果注释掉参数是char的方法则输出结果是:Hello int
如果再注释掉参数是int的方法则输出结果是:Hello long
如果再注释掉参数是long的方法则输出结果是:Hello float
如果再注释掉参数是float的方法则输出结果是:Hello double

结果分析1:

因为此时char类型的'a' 除了可以代表有个字符串还可以代表数字97索引如果注释掉参数为char的方法则会自动转型到int。
如果继续注释则会按照:
charintlongfloatdouble的顺序进行匹配。但是它始终不会匹配到byte和short参数的方法,因为char到byte和short的转型是不安全的。

输出结果2:

如果继续注释只保留:

    public static void sayHello(Character arg){        System.out.println("Hello Character");    }    public static void sayHello(char... arg){        System.out.println("Hello char...");    }    public static void sayHello(Serializable arg){        System.out.println("Hello Serializable");    }    public static void sayHello(Comparable<Character> arg){        System.out.println("Hello Comparable<Character>");    }

输出结果为:Hello Character
此时如果再次注释掉参数为Character的方法可以发现编译器报出如下错误:
这里写图片描述
如果注释掉参数为Serializable 或者Comparable<Character> 中的一个则输出结果为:
Hello Comparable<Character> 或者Hello Serializable

如果把参数为Serializable 或者Comparable<Character> 的方法都注释掉则输出结果为:
Hello char...

结果分析2:

在没有了基本类型参数的方法或者没有类型安全的基本类型参数方法不存在的情况下会产生依次装箱操作,char Character
在没有了参数为Character的方法的情况下,会找不到装箱类,但是如果找到了装箱类实现的接口类型则同样可以实现匹配(这里应该是上转型)Character类实现的接口:
这里写图片描述
可以看到一共实现了两个接口SerializableComparable<Character>,此时以Serializable 或者Comparable<Character> 的方法优先级相同。编译器无法确定要使用的静态类型,于是报错。如果想使用必须显示指明,比如:sayHello(Serializable 'a');

变长参数类型char 的优先级是最低的,如果只剩下参数为char参数的方法则输出结果就是:Hello char...

原创粉丝点击