2017-04-15 38 views
2

我在下面的例子困惑。有些人可以解释我为什么在例1中会打印“st”,并且在例2中给非基元类型和非父子关系类提供了编译时间模糊性。方法在Java中显示歧义超载对非基本类型和非亲子关系课程

实施例1对

public class FinalTest { 
    public static void main(String[] args) { 
     name(null); 
    } 

    public static void name(String s) { 
     System.out.println("st"); 
    } 

    public static void name(Object s) { 
     System.out.println("obj"); 
    } 
} 

实施例2

public class FinalTest { 
    public static void main(String[] args) { 
     name(null); 
    } 

    public static void name(String s) { 
     System.out.println("st"); 
    } 

    public static void name(Integer s) { 
     System.out.println("obj"); 
    } 
} 
+1

的可能的复制[编译器错误:引用调用暧昧(http://stackoverflow.com/questions/14053596/compiler-error-reference-to-call-含糊不清) –

+0

没有它不重复,它可能属于同一类别,但它有不同的情况。 –

回答

3

在实施例1 public static void name(String s)public static void name(Object s)更具体。因此,在name(null);null应该是一个String对象是null

但实施例2两者public static void name(String s)public static void name(Integer s)在处于特定相等。所以,两种方法name(String)FinalTestFinalTest匹配name(null);方法name(Integer)

15.12.2.5. Choosing the Most Specific Method进行了详细的描述。

下面应该工作:

public class FinalTest { 
    public static void main(String[] args) { 
     String s = null; 
     name(s); 
     Object o = null; 
     name(o); 
     Integer i = null; 
     name(i); 
    } 

    public static void name(String s) { 
     System.out.println("String"); 
    } 

    public static void name(Object s) { 
     System.out.println("Object"); 
    } 

    public static void name(Integer s) { 
     System.out.println("Integer"); 
    } 
} 
+0

阿克塞尔,我没有得到你的意思是“更具体”和“具体是否相等”..? –

+0

见http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5 –

+0

明白了,非常感谢你:) –