簡體   English   中英

為什么 Eclipse 說 null 是一種原始類型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM