做任何==对象

时间:2016-08-04 07:27:55

标签: kotlin

kotlin中的以下代码:

Any().javaClass

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

5 个答案:

答案 0 :(得分:27)

没有

来自Kotlin docs (强调我的)

  

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.Objectkotlin.Any!的处理方式相同。但!也意味着该类型是一种平台类型,这意味着禁用空检查等。

  

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

     

...

     

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

答案 1 :(得分:11)

Kotlin编译器将kotlin.Anyjava.lang.Object视为两种不同的类型,但在运行时它们使用相同的java.lang.Object 表示>

javaClass属性返回实例的运行时类,这就是为什么在这两种情况下都得到相同的java.lang.Object类。

还有其他类型在编译时是不同的,但在运行时是相同的;它们列在文档的Mapped types部分。

答案 2 :(得分:0)

事实上,在Kotlin lang方面没有java.lang.Object,所以你当然不能说AnyObject。您只能说Any代替Kotlin中的Object

答案 3 :(得分:0)

"Any"java.lang.Object的类比:Kotlin中所有类的超类。

答案 4 :(得分:0)

完全一样。它只是屏蔽了 Kotlin 不想要的属性:

fun main() {
    val any = Any()//java Object
    val obj = Object()//java Object
    println(any::class)//Object class
    println(obj::class)//Object class
}

小:

fun test(aaaaa: Any) {
}
  public final static test(Ljava/lang/Object;)V
    // annotable parameter count: 1 (visible)
    // annotable parameter count: 1 (invisible)
    @Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
   L0
    ALOAD 0
    LDC "aaaaa"
    INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
   L1
    LINENUMBER 4 L1
    RETURN
   L2
    LOCALVARIABLE aaaaa Ljava/lang/Object; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1

  @Lkotlin/Metadata;(mv={1, 4, 2}, bv={1, 0, 3}, k=2, d1={"\u0000\u000e\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0000\n\u0000\u001a\u000e\u0010\u0000\u001a\u00020\u00012\u0006\u0010\u0002\u001a\u00020\u0003\u00a8\u0006\u0004"}, d2={"test", "", "aaaaa", "", "SPWrapper.app"})
  // compiled from: T.kt
}