我试图了解如何通过转换调用重载方法。让我用我正在尝试的示例解释我的问题
public class Autoboxing {
public void meth(Integer i){
System.out.println("Integer");
}
public void meth(long i){
System.out.println("Long");
}
public void meth(int... i){
System.out.println("int");
}
public void meth(Object i){
System.out.println("Object");
}
public static void main(String[] args) {
Autoboxing box= new Autoboxing();
box.meth(5);
}
}
这里的输出是:长
为什么在Wrapper Integer中调用带有参数long的方法。请解释。
答案 0 :(得分:5)
重载分辨率有三个阶段。第一阶段尝试在不使用自动装箱和变量的情况下找到匹配方法(这就是选择meth(Integer i)
而不是{{1}}的原因)。仅当第一阶段没有找到任何匹配时,第二阶段才会尝试使用自动装箱找到匹配的方法。
答案 1 :(得分:2)
当Method Overloaded窗体出现时,用户尝试在以这种方式选择的编译器之间调用,
如果找到,则立即与数据类型完全匹配,然后立即调用。 1.1如果完全匹配不匹配,则编译器尝试匹配更广泛的类型数据类型。
如果上述情况失败,则开始与自动装箱方式匹配。
所以在你的情况下5是integer(primitive)
所以它开始与int
'匹配(1例),但是失败,所以尝试匹配更广泛的数据类型。
在这种情况下,在您的情况下,它与long
(原始)相匹配,后者比int
'
所以,你得到" Long
"输出
因此,同样在重载方案时编译器行为也来了。
答案 2 :(得分:0)
我理解 这里的优先级是第一个是加宽然后自动装箱然后是varargs。 因为扩大原始参数比自动装箱要好得多。