null作为方法参数的类型是什么?

时间:2014-02-16 11:12:30

标签: java

所以这就是这个例子

public static void main(String[] args) {        
    new Stuff(null);
    new Stuff("a");
    new Stuff(1);           
}

和类Stuff定义如下

public class Stuff {    
       Stuff(Object o){
           System.out.println("object");        
       }

       Stuff(String s){
           System.out.println("string");        
       }

}

输出

string
string
object

Java如何告诉nullString?如果我将Stuff更改为

public class Stuff {    

       Stuff(String s){
           System.out.println("string");        
       }

       Stuff(Integer o){
           System.out.println("Integer");           
       }

}

我收到Stuff(null)的编译错误:

The constructore Stuff(String) is ambigous. 

再次,为什么Java“决定”nullString

2 个答案:

答案 0 :(得分:19)

  • 编译器首先列出所有适用的方法。在您的情况下,两者都适用。
  • 然后尝试找到一种比其他方法更具体的方法。
  • 在您的第一个示例中,StringObject的子类,因此更具体。
  • 在第二个示例中,两个方法都适用(String和Integer),但两者都不比另一个更具体(String不是Integer的子类,而不是String的子类)。所以存在歧义,因此编译错误。

确定应选择哪种方法的完整算法在JLS

中定义

答案 1 :(得分:6)

因为String比Object更具体。在确定要使用哪种构造函数或方法时,Java总是尝试使用更具体的匹配。