为什么以及如何编译此Java代码?

时间:2016-03-23 23:34:17

标签: java

以下代码打印" String"

public class Riddle {

    public static void main(String[] args) {
        hello(null);
    }

    public static void hello(Object o) {
        System.out.println("Object");
    }


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

}

为什么代码会编译? Isn null 不明确吗?

例如,由于签名不明确,以下代码将无法编译。

public class Riddle {

    public static void main(String[] args) {
        hello(null);
    }

    public static void hello(Object o) {
        System.out.println("Object");
    }

    public static void hello(Integer o) {
        System.out.println("Integer");
    }

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

}

有人可以解释为什么第一个例子可以在没有模糊错误的情况下编译吗?

2 个答案:

答案 0 :(得分:1)

在第二种情况下,由于编译器无法在采用Integer的方法和采用String的方法之间做出决定,因此编译器可以解决这个问题。

参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2

答案 1 :(得分:0)

请参阅JLS §15.12.2

  

按照调用目的解决方法的顺序很重要   当存在相同类型的数据类型时,

     
      
  1. (对于原始数据类型)精确数据类型匹配然后调用它。   1.1如果没有,那么调用更广泛然后这个数据类型可用,然后调用它。
  2.   
  3. 匹配Wrapper类型的Data-type或其父项,如果上面失败那么。
  4.   
  5. 如果超过2次失败,此数据类型的Vararg将匹配。
  6.