Kotlin類別的起源:Any

Mon, Nov 8, 2021 閱讀時間 1 分鐘

The root of the Kotlin class hierarchy. Every Kotlin class has Any as a superclass.

Any是kotlin所有不可為空類別(也就是沒有?)的父類別,相當於java的Object類別,如果要允許空值還有一個Any?,而且嚴格來說Any?才是所有類別的根類別,雖然Any和Any?並沒有繼承的關係

這邊就要講到子類型(Subtyping)和繼承(Inheritance)兩個不同的概念,子類型講的是類型之間的關係,從相容性的角度來看,如B是A的子類型(subtype),在需要A的地方,同樣也可以用B來替換,這跟實作無關,在java就是介面繼承,而繼承強調的是可以重用(reuse)父類別的代碼,屬於實作繼承,所以java的extends等於是同時宣告了繼承和父子類別的關係

那我們用子類型的概念來看kotlin的Any和Any?,從這個例子可以看到參數為Any?的函數可以傳入一個Any的值,反之卻不行,所以Any可以代替Any?,符合子類型的定義,也就可以說Any?是Any的父類了

fun main() {
    val x: Any = "String"
    describe(x)
}

fun describe(obj: Any?) {
    if (obj != null) {
        println(obj::class.simpleName)
    }
}