2011-04-27 177 views
21

我發現了一些代碼,我正在處理null轉換爲Object,因爲它傳遞給一個方法。爲什麼要將null轉換爲Object?

爲什麼要這樣做?

我知道this question它處理重載的方法,並使用強制轉換來確定調用哪個版本的方法。

但是,如果未進行鑄造,將沒有結束的方法的任何其他匹配的版本來選擇一個重載方法與類型爲Object一個參數,如果該方法是帶一個空參數?那麼演員還能完成什麼?

+0

可能重複的[爲什麼null cast?](http://stackoverflow.com/questions/315846/why-null-cast) – 2014-04-16 14:51:46

回答

38

如果其中進行投,那麼最具體版本將被選擇。

null可以是String類型的空引用或Object類型的空引用。所以如果這兩種方法都可用,那麼將調用String方法。

如果你有方法與ObjectIntegerString然後調用與null(無投)將給出一個編譯錯誤,因爲IntegerString都是有效和同樣具體(即沒有一個的特殊化另一個)。在這種情況下,您將轉換爲null以指定要調用的方法。

+0

儘管我同意你的回答,但我相信第一條語句不正確,即如果多個方法適用,編譯器總是嘗試找到最具體的匹配項,例如,如果您將null轉換爲Integer並且重載方法分別使用Object類型和Number類型參數,然後它將解析爲Number類型(即最具體的一個)。 – sactiw 2015-06-15 17:25:07

-2

「但如果不進行投,不會與類型爲對象的參數的重載的方法來在方法的其他任何匹配版本選擇,如果該方法是帶一個空參數?」

不,因爲'null'沒有類型 - 你會得到一個編譯錯誤。

+4

錯誤。只有你**,如果有多個「最具體」的過載周圍,就會得到編譯錯誤。 – 2011-04-27 15:00:29

+0

我假定他有不止一種方法,這是嵌入式問題。 – cbz 2011-04-27 16:00:23

14

Object方法」始終是所有「適用方法」中「最不具體」的方法。這就是編譯器不會選擇它的原因。

如果運行

String.valueOf(null); 

那麼編譯器有兩種「適用方法」的選擇。你實際上叫更具體的方法

String.valueOf((char[]) null); 

這將給你一個NullPointerException。爲了調用其他方法,寫

String.valueOf((Object) null); 

在這種情況下,你仍然只有一個「適用法」,這樣你就不會有不同,重載的方法是「更具體」的問題。

+0

對於String.valueOf(Object o),+1是在所有可能的匹配中「最不具體」匹配。然而,如果沒有完成特定的轉換,那麼在String的情況下,我們留下的「最具體的」匹配是'String.valueOf(Char [] c)',因此它會被調用。 **注意:** java編譯器總是將重載的方法解析爲具有「最具體」匹配的方法,如果它未能這樣做,它會給'方法的引用是ambiguos'編譯錯誤。 – sactiw 2015-06-15 16:30:33

+0

@sactiw:謝謝你的提示。是的,我錯誤地輸入了char []與byte []'...... – 2015-06-15 17:04:07

0

雖然以前的答案已經解釋瞭如果您將null轉換爲Object但如果不將null轉換爲Object,但我仍然希望添加幾個缺失的點。

所以在Java中,'數組'是對象,這意味着它們可以被分配給對象類型即如果你做new char[0].getClass().getSuperclass()它給出java.lang.Object,因此,如果沒有明確投出null,編譯器選擇valueOf(char[])而不是valueOf(Object)作爲最適用的方法。

然而,來這裏的缺失部分,此前,沒有一個重載的方法這是接受接口類型參數(記得接口不繼承對象類,所以他們也造成最具體的方式選擇歧義)如valueOf(CharSequence)則會導致編譯時錯誤(即對valueOf的引用不明確),因爲編譯器無法選擇最適用的方法。

因此,底線是避免將原料空作爲方法的參數,而總是將它們轉換成參數類型的方法被調用。 :)

相關問題