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

Pao*_*olo 13 java

所以这就是这个例子

public static void main(String[] args) {        
    new Stuff(null);
    new Stuff("a");
    new Stuff(1);           
}
Run Code Online (Sandbox Code Playgroud)

和类Stuff定义如下

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

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

}
Run Code Online (Sandbox Code Playgroud)

输出是

string
string
object
Run Code Online (Sandbox Code Playgroud)

Java如何告诉它null是一个String?如果我换Stuff

public class Stuff {    

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

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

}
Run Code Online (Sandbox Code Playgroud)

我得到编译错误Stuff(null):

The constructore Stuff(String) is ambigous. 
Run Code Online (Sandbox Code Playgroud)

再说一次,为什么Java"决定" null是一个String

ass*_*ias 19

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

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


cel*_*zar 6

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