做任何==对象

osh*_*hai 32 kotlin

kotlin中的以下代码:

Any().javaClass
Run Code Online (Sandbox Code Playgroud)

有价值java.lang.Object.这是否意味着AnyObject是同一类?他们的关系是什么?

Mic*_*son 28

没有.

来自Kotlin文档 (强调我的)

Kotlin中的所有类都有一个共同的超类Any,对于没有声明超类型的类,它是默认的超类:

class Example // Implicitly inherits from Any

Any不是java.lang.Object ; 特别是,除了和之外equals(),它没有任何成员.有关更多详细信息,请参阅Java互操作性部分.hashCode()toString()

此外,从映射类型的部分我们发现:

Kotlin专门处理一些Java类型.这些类型不是"按原样"从Java加载的,而是映射到相应的Kotlin类型.映射仅在编译时很重要,运行时表示保持不变.Java的原始类型映射到相应的Kotlin类型(记住平台类型):

...

java.lang.Object kotlin.Any!

这表示在运行时 java.lang.Object并且kotlin.Any!处理相同.但这!也意味着类型是一种平台类型,这意味着禁用空检查等.

Java中的任何引用都可能为null,这使得Kotlin对严格的null安全性的要求对来自Java的对象不切实际.Java声明的类型在Kotlin中被特别处理并称为平台类型.对这些类型放宽空检查,因此对它们的安全保证与Java相同(见下文).

...

当我们在平台类型的变量上调用方法时,Kotlin在编译时不会发出可空性错误,但是调用可能在运行时失败,因为空指针异常或Kotlin生成的断言以防止空值传播:

  • 请参考以下网址:https://kotlinlang.org/docs/reference/java-interop.html#mapped-types (2认同)

Ily*_*lya 11

科特林编译器将kotlin.Anyjava.lang.Object作为两个不同的类型,但在运行时它们被表示以相同的java.lang.Object .

javaClassproperty返回实例的运行时类,这就是为什么java.lang.Object在这两种情况下都获得相同类的原因.

还有其他类型在编译时是不同的,但在运行时是相同的; 它们列在文档的" 映射类型"部分中.