2015-10-29 36 views
4

我试图了解重载方法的调用方式与conversions.Let我解释一下我的问题与一个例子我想方法调用转换

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); 
    } 
} 

这里输出为:长

为什么法参数long在Wrapper Integer中被调用。请解释。

+2

http://stackoverflow.com/q/27940321/1878022如果这有助于理解 – VedX

回答

2

虽然方法重载形式来和用户尝试中的编译器,然后以这种方式选择了要调用,

  1. 精确匹配与数据类型,如果找到然后调用立刻。 1.1如果完全匹配不匹配,则编译器尝试匹配更广泛的类型数据类型。

  2. 如果上述情况失败,那么它开始与自动装箱方式相匹配。

  3. 所有以上2个案例失败,然后开始与vararg案件匹配。
  4. 所有以上的案件失败,同时给错误不能解决方法名称。

所以你的情况5 integer(primitive)所以它开始匹配int“(1例),但不能因此尽力配合与更广泛的数据类型。 在这里,你的情况是与long(原始)匹配是更广泛的那么“int

所以,你得到“Long”输出。

因此,同样在编译器行为超载的情况下来了。

5

超载分辨率有三个阶段。第一阶段试图找到一个匹配的方法,而不使用自动装箱和可变参数(这就是为什么选择meth(long i)而不是meth(Integer i))。只有第一阶段没有发现任何匹配时,第二阶段才会尝试使用自动装箱功能找到匹配的方法。

0

据我所知, 这里的优先顺序是第一是加宽,然后自动装箱,然后varargs。 由于拓宽原始参数比自动装箱要好得多。

相关问题