這篇文章主要給大家介紹了關於Kotlin類型系統的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Kotlin具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
Quote
在學習 Kotlin 的過程中,對 Kotlin 的類型系統產生了好奇,Kotlin 是否存在類似於 Java 中 Object 的公共基類?Kotlin 中是否也有類似於 Java 基礎類型這樣的單獨分支?在研究一番過後,博主發現相較於 Java,Kotlin 交出了更爲滿意的答案,而且出乎意外地簡單,只需要遵循簡單的規則,便能理解整個類型系統。
Any
Any 等同於 Java 中的 Object 的概念,Any 在註釋中這麼寫到:
The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.
我們來簡單驗證下 Any 是一切的基類。
class Fruit fun main(args: Array<String>) { println(Fruit() is Any) }
在上面的代碼中,我們新建了一個類,然後構造它的實例,看它是否爲 Any,答案顯而易見地爲 true。
我們在看一些 kotlin 中的基礎類型,也就是 Int、Double、Float、Byte 等等的父類是否也是 Any。
println(3.233F is Any) println(2 is Any)
答案也是true。這裏額外地解釋下,Kotlin 並沒有 Java 中基礎類型和封裝類型差異化處理,也沒有拆箱和裝箱的處理。基礎類型就是基礎類型,但它們也以Any作爲父類。
Unit
再來看看 Unit 這個 Kotlin 中的特殊東西。
/** * The type with only one value: the `Unit` object. * This type corresponds to the `void` type in Java. */ public object Unit { override fun toString() = "kotlin.Unit" }
在 kotlin 中每個函數一定是有返回值的。
這裏說明一下概念,也將會在後續的章節裏面再次提到。kotlin 爲了這個一定有返回值這個概念,做了很多工作,但好處是非常明顯的,我們能夠以統一的視角來看待 kotlin 的函數。
Unit 這個概念表徵着什麼都不做,但什麼都不做確實也是一種返回值。如果我們不做任何聲明,函數的返回值就是 Unit,表明我返回了一個什麼都沒做的東西。
我們來驗證一下,聲明一個空函數,然後打印它。(在 Java 中會編譯不過)
fun justReturn() { } fun main(args: Array<String>) { print(justReturn()) }
結果輸出了kotlin.Unit,證明了返回值就是 Unit。
那麼這裏有一個疑問,就是 Unit 和 Any 什麼關係?我們通過 is 關鍵字來看看。
fun main(args: Array<String>) { print(justReturn() is Any) }
恩恩,Unit 也是 Any 的子類!
Nothing
我們繼續延展下kotlin 中每個函數一定是有返回值的這個概念。前面我們看的是正常返回的情況,那如果程序發生異常,也會有返回值嗎?kotlin 對於這種情況,也是延續了一定有返回值這種概念。這個返回值叫做 - Nothing!
Nothing 意味着不可達,程序實際運行時不會產生任何一個 Nothing 類型對象,啥?!這怎麼理解。kotlin 一旦發現返回了 Nothing,會保證後面的代碼不再執行。
所以 Nothing 常用於 throw 這樣異常退出的情況,這樣後續的代碼就不會被執行。我們看看 kotlin 中自身的例子。
/** * Terminates the currently running process. * * @param status serves as a status code; by convention, * a nonzero status code indicates abnormal termination. * * @return This method never returns normally. */ @kotlin.internal.InlineOnly public inline fun exitProcess(status: Int): Nothing { System.exit(status) throw RuntimeException("System.exit returned normally, while it was supposed to halt JVM.") }
注意啦,我們再看看 Nothing 在類型系統中的位置。Nothing 與 Any 相反,是一切類型的子類!也就是說 Nothing,是 Fruit、是 School、是 Money、也是 Any。Nothing 意味着不可達的狀態,每一種類型都包含這種不可達的狀態,因而這種狀態 Nothing,是這些的子類。
注意上圖中 Nothing 所處的位置。
Nullable
kotlin 的一大殺手鐗就是這個可空類型,一種類型後面加上?,這種類型就可以爲空了。我們來看看引入可空類型過後,類型系統是怎樣的。
1、首先看看普通類和可空類型之間的關係。
class Fruit fun main(args: Array<String>) { print(Fruit() is Fruit?) }
答案是true,這裏很好理解,兩者之間的區別在於是否可以爲空,可以爲空的自然而然是基類,不可爲空的是可以爲空下的一種派生。
2、Any 是否有可空類型
kotlin 最讓人欣賞的地方在於一個概念貫徹到底。Any 在 kotlin 中也是有可空類型的。感官上 Any? 是 Any 的父類,Any 是不可空類型的父類,所以 Any? 也是不可空類型的父類嗎?答案就是這樣的,我們來驗證下。
class Fruit fun main(args: Array<String>) { print(Fruit() is Any?) }
3、Unit 是否有可空類型
是的,Unit 也有空類型 Unit?。但這是一個難理解的概念,其本身包含了兩個值 Unit 和 null。這是 kotlin 爲了延續統一的概念,很少會有場景使用到,但咱們得清楚。
4、Nothing 是否有可空類型
Nothing 當然也有可空類型 Nothing?,其本身有且僅有一個值 null,也就是說其就是 null。Nothing 本身不可達,不會有任何一個實例,那就只能是 null 了。
我們來驗證一下
fun main(args: Array<String>) { println(null is Nothing) println(null is Nothing?) println(null is Any) println(null is Any?) }
分別是 false、true、false 和 true。
總結
這裏借用下 natpryce 的圖,大家看一下這張圖,這就是 kotlin 的類型系統。
咱們只需要理解一下幾點,就完全弄明白 kotlin 類型系統。
- Any 和 Nothing 分別是所有對象的基類和子類。
- 可空類型是不可空類型的父類。
當我們不清楚類型時,對照上面兩個概念就能明白。
參考
- Mistaeks I Hav Made: A Whirlwind Tour of the Kotlin Type Hierarchy
- https://proandroiddev.com/nothing-else-matters-in-kotlin-994a9ef106fc
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對神馬文庫的支持。