夥計們,可以在任何一個給我this book遇到短語的合乎邏輯的解釋:爲什麼null被稱爲「每個引用類型的子類型」?
您可能會發現它有助於想到
? extends T
爲包含在間隔每一種類型的下面和null
類型北臨T
以上(其中null
的類型是每個參考類型的子類型)。
謝謝。
夥計們,可以在任何一個給我this book遇到短語的合乎邏輯的解釋:爲什麼null被稱爲「每個引用類型的子類型」?
您可能會發現它有助於想到
? extends T
爲包含在間隔每一種類型的下面和null
類型北臨T
以上(其中null
的類型是每個參考類型的子類型)。
謝謝。
我認爲這只是意味着您可以將空引用分配給任何引用類型。這並不意味着我是一個非常有幫助的思考方式。
Java語言規範有這樣說的空類型(section 4.1):
還有一個特殊的空類型, 型表達空,其中有 沒有名字的。由於空類型沒有 名稱,因此無法聲明空類型的 變量或將 轉換爲空類型。空引用 是空類型的 表達式的唯一可能值。無效 引用可以始終轉換爲任何 引用類型。在實踐中,程序員可以忽略空類型 ,只是假裝null僅僅是一個 特殊字面值,它可以是任何 引用類型。
所以,這裏的關鍵詞是'空引用總是可以轉換爲任何引用type',這要求'空的類型是每一個參考type'的亞型是什麼原因使auhthor。奇怪的一個:)謝謝指出這一點。 – Max 2010-08-16 17:50:15
這是一種有用的思維方式,因爲它告訴你Java的類型系統不健全,反過來使它幾乎沒用。 – 2010-08-16 20:40:55
這意味着null可以是任何類型。
您可能有一個類Animal
與Dog
的子類。 如果您有一個類型爲Animal
的變量,其值爲null
您不能確定null
是Animal
類型還是Dog
類型。兩者同樣有效。
我認爲這是一個有點欺騙性的陳述。值'null'總是隻有一種類型 - 'null'類型。它不能是「任何類型」。類型系統定義了類型'null'(它只被'null'值居住)成爲所有引用類型的子類型。在你的例子中,這好像你有一個隱含的'null'類被定義爲'Animal'的子類,因此將值'null'(這個'null'類的一個實例)賦值是有效的,到「動物」類型的變量。 – Gian 2010-08-16 17:56:59
null instanceof T
爲任何類型T
'System.out.println(null instanceof Object);''false''怎麼樣? – Max 2010-08-16 17:45:56
這完全不正確。 Java創作者竭盡全力讓這種情況始終爲假 – 2010-08-16 17:47:44
我很尷尬。我只是假設! – Ladlestein 2010-08-16 18:48:57
類型形成一個偏序,在程序集合中的所有類型的,即任何兩種屬實,有可能是他們之間的關係(即T1 < T2
- 某種意義上T2是T1的一個子類型)。不相關的類層次結構中的事物沒有定義這樣的關係。
所以基本上這是告訴你的是? extends T
描述的這組類型的所有成員都小於T
並且大於null
。 null作爲所有東西的子類型存在,因爲將值null
分配給引用總是有效的。
更正式地說:
∀x ∈ ? extends T. null ≥ x ≥ T
Java有null類型。預JLS3,所述 null類型是沒有正式的任何類型的 亞型,和空 參考不是正式的任何類型的除空類型的值 。一個 法令作出的空引用 強制轉換爲任何引用類型 實際的理由。 (這類似於 使得列表 分配給即使名單是不是 亞型列表。你知道 法令爲捕獲轉換。列表形式 參數法令)JLS3 空類型定義爲一種亞型每種類型都有 ,所以它看起來像Bottom一樣非常多 。
雖然不是你詢問的部分,但我不確定我是否喜歡「下面的null類型和下面的T類型的區間」。因爲'null'可以被轉換爲* any *類型的引用,所以我覺得它比'T'更不「特定」,這會使間隔變得有點怪異......我想我只是在挑剔雖然我自己的(可能有數學上的缺陷)解釋的基礎。 :P – 2010-08-16 17:54:31
@Tim:蒂姆,我完全同意你的這個相當直觀的邏輯,因爲他說「作爲一個子類,」讓我具體和實際使用+類型層次和麪向對象的東西的不動產的事......看貼的一篇文章通過@JRL – Max 2010-08-16 18:00:08