kotlin中的以下代码:
Any().javaClass
值为java.lang.Object
。这是否意味着Any
和Object
是同一个类?他们的关系是什么?
答案 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.Object
和kotlin.Any!
的处理方式相同。但!
也意味着该类型是一种平台类型,这意味着禁用空检查等。
Java中的任何引用都可能为null,这使得Kotlin的要求 对于来自Java的对象,严格的null安全性是不切实际的。种类 Java声明在Kotlin中被特别处理并称为平台 类型。对这些类型放宽空检,以确保安全 对于他们来说与Java相同(见下文)。
...
当我们在平台类型的变量上调用方法时,Kotlin没有 在编译时发出可空性错误,但调用可能会失败 运行时,因为空指针异常或Kotlin的断言 生成以防止空值传播:
答案 1 :(得分:11)
Kotlin编译器将kotlin.Any
和java.lang.Object
视为两种不同的类型,但在运行时它们使用相同的java.lang.Object
类表示>
javaClass
属性返回实例的运行时类,这就是为什么在这两种情况下都得到相同的java.lang.Object
类。
还有其他类型在编译时是不同的,但在运行时是相同的;它们列在文档的Mapped types部分。
答案 2 :(得分:0)
事实上,在Kotlin lang方面没有java.lang.Object
,所以你当然不能说Any
是Object
。您只能说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
}