深入浅出,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的差异

猜你喜欢

转载自blog.csdn.net/jiese1990/article/details/105937111