一、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 Properties 和 Extension 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的差异