2014-02-16 55 views
13

所以這裏這個例子null作爲方法參數的類型是什麼?

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

和類的東西被定義爲跟隨

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

+1

因爲String是所有其他中最接近'null'的字符串:「* Java編程語言使用選擇最具體方法的規則*」。 – Maroun

+2

值得一提的是,'null'不是一個字符串,一個對象或一個整數。 (這只是他們的明顯缺乏)。 –

+1

由於未生成註釋:http://stackoverflow.com/q/13033037/1864167 –

回答

19
  • 編譯器首先列出所有可用的方法。在你的情況下,兩者都適用。
  • 然後,它試圖找到比其他(s)更具體的方法。
  • 在第一個示例中,StringObject的一個子類,因此更具體。
  • 在第二個示例中,兩種方法都適用(字符串和整數),但都不比其他方法更具體(字符串不是Integer的子類,它不是字符串的子類)。所以有一個不明確的地方,因此編譯器錯誤。

確定應選擇哪種方法的完整算法在JLS中定義。

6

因爲String比Object更具體。當找出使用哪個構造函數或方法時,Java總是試圖使用更具體的匹配。

+0

+1的可能重複,並且整數或字符串都不是比另一個更具體。 –

相關問題