没有任何==对象
下面的代码在kotlin中:
Any().javaClass
具有java.lang.Object
值。 这是否意味着Any
和Object
是相同的类? 他们有什么关系?
没有。
从Kotlin文档 (Emphasis我的文档 )
Kotlin中的所有类都有一个公共超类
Any
,这是一个没有声明超类型的类的默认超类:
class Example // Implicitly inherits from Any
Any
不是java.lang.Object
; 特别是它没有除equals()
,hashCode()
和toString()
之外的任何成员。 有关更多详细信息,请参阅Java互操作性部分。
此外,从映射类型的部分我们发现:
Kotlin专门处理一些Java类型。 这些类型不是从Java“按原样”加载的,而是映射到相应的Kotlin类型。 映射只在编译时很重要,运行时表示保持不变。 Java的原始类型被映射到相应的Kotlin类型(记住平台类型):
…
java.lang.Object
kotlin.Any!
这表示在运行时 java.lang.Object
和kotlin.Any!
被对待是一样的。 但是!
也意味着这个类型是一个平台类型,这对于禁用空值检查等有其含义。
Java中的任何引用都可能为空,这使得Kotlin对来自Java的对象的严格无效安全的要求是不切实际的。 Java声明的类型在Kotlin中被专门处理,并被称为平台类型。 对于这种类型,空值检查是放松的,所以它们的安全保证与Java中相同(参见下面的更多内容)。
…
当我们在平台类型的变量上调用方法时,Kotlin在编译时不会发出可空性错误,但是由于Kotlin生成的空指针异常或断言来阻止空值传播,所以调用在运行时可能会失败:
Kotlin编译器将kotlin.Any
和java.lang.Object
视为两种不同的类型 ,但在运行时它们使用相同的java.lang.Object
类表示 。
javaClass
属性返回实例的运行时类,所以这就是为什么在这两种情况下都得到相同的java.lang.Object
类。
在编译时也有不同的类型,但在运行时是一样的。 它们列在文档的“ 映射类型”部分中。
其实在Kotlin lang方面没有java.lang.Object
,所以你一定不能说Any
是Object
。 你只能说Any
取代Kotlin中的Object
。