[英]Why does Eclipse say that null is a primitive type?
我在 Eclipse Mars 中寫了這行代碼,目的是為了搞砸:
null.toString();
我收到以下編譯器錯誤消息:
無法對原始類型 null 調用 toString()
這很奇怪,因為null
既不是原始類型,也不是對象引用,如下所述: Is null an Object?
所以,可以肯定的是,我嘗試使用javac
編譯這樣奇怪的代碼行,我得到了這個結果:
NullTest.java:3: <nulltype> cannot be dereferenced null.toString(); ^ 1 error
有人知道為什么 Eclipse 會給出這樣的(IMO)誤導性編譯器錯誤消息?
由於 null 類型是Object
的子類型,可以想象在null
上調用Object
方法是可以的。
然而,按照這個邏輯,由於 null 類型是每個引用類型的子類型,我們應該被允許在null
上調用任何類/接口的任何方法。 那將是一團糟。
在語法上, null.toString()
應該被識別為方法調用表達式,因為null
是一個Primary
表達式。 然后,為了確定搜索toString
方法的類/接口,JLS 說
...如果 T 是類或接口類型,則要搜索的類或接口為 T,如果 T 是類型變量,則為 T 的上限
如果 T 不是引用類型,則會出現編譯時錯誤。
T
是這里的空類型; 它不是類類型、接口類型或類型變量,因此這一步應該失敗。 但是,它是否會因為T 不是引用類型而失敗?
null 類型是引用類型嗎? JLS說
類型...分為兩類:原始類型和引用類型
數字類型是....
引用類型是類類型、接口類型、[類型變量]和數組類型。 [時期!]
還有一種特殊的空類型。
根據您對文本的解析,null-type 可能是也可能不是引用類型。 這通常並不重要。 這只是一個分類問題。 但它會導致混淆,例如在這種情況下 - 失敗是因為T
不是“正確的”引用類型,並且編譯器錯誤地推斷它必須是原始類型。
沒有理由。
通常 eclipse 會分析字節碼,並且出於某種原因null.toString()
是兩個字節碼語句,一個定義和一個調用。 因為您只能在對象上調用toString
,所以 eclipse 假定聲明必須聲明一個原語。
您可以編寫錯誤報告,但請考慮錯誤消息國際化可能帶來的開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.