深入淺出,kotin Any類

一、Any vs Object,兩個類的成員變量的差異。

public open class Any {
    public open operator fun equals(other: Any?): Boolean
    public open fun hashCode(): Int
    public open fun toString(): String
}
public class Object {
  
    public boolean equals(Object obj) {}
    public int hashCode() {}
    public String toString() {}
  
    public final native void wait() throws InterruptedException;
    public final void wait(long millis) throws InterruptedException {}
    
    @FastNative
    public final native void notify();
    @FastNative
    public final native void notifyAll();
    ...
}

可以看到Any類只有3個成員方法,equals()、hashCode()、toString(),而Object的成員更豐富,不止有這三個方法。

還有wait()、notify()等方法。

二、Any類只在編譯期存在,runtime時Any類就是Object類

Object是java的祖先類,Any是kotlin的祖先類。the root of the class hierarchy。

但是實際上runtime時沒有Any類,在虛擬機運行時,Any類就是Object類。Any類只在編譯期存在。

我們先來看一個demo:

將Any對象強制轉換爲Object是否會崩潰?

類型強制轉換後,調用Object纔有的方法,是否會崩潰?

然後,打印Any對象的類的名稱。

fun main() {
    val anyObj = Any()
    val obj = anyObj as Object//將Any對象強制轉換爲Object是否會崩潰?
    synchronized(obj) {
        obj.wait(100)
    }
    println("anyObj:$anyObj ; obj:$obj")
    println("---------------------------------")
    println("anyObjClass:${anyObj.`class`} ; objClass:${obj.`class`}")
}

輸出日誌:並沒有崩潰

log

我們找到如下官方文檔:

https://kotlinlang.org/docs/reference/java-interop.html#mapped-types

文檔的大致意思是,在編譯期,當kotlin代碼中混合使用java類和一些java文件的代碼時,並不會直接使用java的一些特殊類型進行編譯,而是將其映射爲kotlin的相關類。但是但是但是,最終在jvm虛擬機中運行時,映射的類和被映射的類是同一個類。也就是說,java類型映射到kotlin類型,僅僅只在編譯期,在運行期,兩個類型沒有區別。

如:Object 會被映射成kotlin的Any! 類型來編譯,但實際在jvm中運行時,Any類就是Object類。

三、Any類的擴展方法和屬性

雖然,Any類中只定義了三個成員方法,equals()、hashCode()、toString(),但是一個Any對象,我們能使用的方法遠不止這三個方法。

如:javaClass、let、also、takeIf等等

截圖

這些成員,是 Extension PropertiesExtension Functions ,在Any類外定以的。

先挖個坑,後面我們有機會再單獨總結下 kotlin 的 Extension Properties和Extension Functions。


更多kotlin 精彩總結:https://juejin.im/collection/5e546b46e51d45364b886612




參考資料:

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/#any
https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html
https://stackoverflow.com/questions/38761021/does-any-object
https://kotlinlang.org/docs/reference/java-interop.html#mapped-types
https://juejin.im/post/5eb1380f6fb9a0432c4c94b0


關鍵詞:kotlin、Any、java、Object、 Any vs Object、Any和Object的差異

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章