【发布时间】:2016-12-10 04:53:35
【问题描述】:
kotlin 中的如下代码:
Any().javaClass
值为java.lang.Object。这是否意味着Any 和Object 是同一类?他们是什么关系?
【问题讨论】:
-
Any 是否支持泛型?
标签: kotlin
kotlin 中的如下代码:
Any().javaClass
值为java.lang.Object。这是否意味着Any 和Object 是同一类?他们是什么关系?
【问题讨论】:
标签: kotlin
没有。
来自Kotlin docs (强调我的)
Kotlin 中的所有类都有一个共同的超类
Any,这是默认的 super 用于没有声明超类型的类:
class Example // Implicitly inherits from Any
Any不是java.lang.Object;特别是,它没有任何equals()、hashCode()和toString()以外的成员。请 有关更多详细信息,请参阅 Java 互操作性部分。
此外,从我们发现的映射类型部分:
Kotlin 特别对待一些 Java 类型。此类类型不是从 Java “原样”,但映射到相应的 Kotlin 类型。映射 仅在编译时很重要,运行时表示仍然存在 不变。 Java 的原始类型映射到相应的 Kotlin 类型(记住平台类型):
...
java.lang.Objectkotlin.Any!
这表示在 运行时 java.lang.Object 和 kotlin.Any! 被视为相同。但是! 也意味着该类型是平台类型,这意味着禁用空检查等。
Java 中的任何引用都可能为 null,这使得 Kotlin 的要求是 对于来自 Java 的对象,严格的空安全性是不切实际的。种类 Java 声明在 Kotlin 中被特殊处理并称为平台 类型。此类类型的空值检查被放宽,因此安全保证 因为它们与 Java 中的相同(见下文)。
...
当我们在平台类型的变量上调用方法时,Kotlin 不会 在编译时发出可空性错误,但调用可能会失败 运行时,因为空指针异常或 Kotlin 的断言 生成以防止空值传播:
【讨论】:
Kotlin generates to prevent nulls from propagating 传播到?
Kotlin 编译器将kotlin.Any 和java.lang.Object 视为两种不同的类型,但在运行时它们用相同的java.lang.Object 表示类。
javaClass 属性返回实例的运行时类,这就是为什么在这两种情况下都得到相同的java.lang.Object 类。
还有其他类型在编译时不同,但在运行时相同;它们列在文档的Mapped types 部分。
【讨论】:
java.lang.Object,然后你就可以在上面调用这些方法了。
事实上,在 Kotlin lang 方面没有java.lang.Object,所以你当然不能说Any 是Object。在 Kotlin 中只能说 Any 代替 Object。
【讨论】:
"Any" 类似于 java.lang.Object:Kotlin 中所有类的超类。
【讨论】:
analogue 是什么意思?在编译时有点不同...
完全一样。它只是屏蔽了 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
}
【讨论】: