首页 > 编程知识 正文

深入浅出kotin Any类

时间:2023-05-03 23:41:08 阅读:274655 作者:1688

一、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`}")}

输出日志:并没有崩溃

我们找到如下官方文档:

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的差异

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。