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