在下面的代码中,linkedSet
变量的类型是 LinkedHashSet<Serializable>
:
val linkedSet = linkedSetOf(linkedSetOf(1, 2, 3), 2)
结果集的第一个元素是LinkedHashSet<Int>
.往上 LinkedHashSet
的层级我没有找到 Serializable
. Int
同样的事情.
为什么继承Serializable
不明确吗?我怎么知道某种类型是 Serializable
?
最佳答案
实际上,如果您从 LinkedHashSet
开始其声明如下:
expect class LinkedHashSet<E> : MutableSet<E> {
expect
然而等待一个实际的实现,它在 JVM 上的实际实现是 java.util.LinkedHashSet
,然后实现 Serializable
:
@SinceKotlin("1.1") public actual typealias LinkedHashSet<E> = java.util.LinkedHashSet<E>
关于 Int
这有点复杂。在那里我们没有看到任何 expect
。但我们知道 Int
可以表示两者:Java 基本类型 int
,也可以表示 Java 类型 Integer
。编译器实际上现在在引擎盖下使用 java.lang.Integer
并通过 java.lang.Number
实现 Serializable
。
您可以在运行时检查实际类型,使用如下内容:
val linkedSet = linkedSetOf(linkedSetOf(1, 2, 3), 2)
linkedSet.forEach { content ->
content::class.java.interfaces.joinToString {
it.simpleName
}.also {
println("${content::class.java}: $it")
}
}
关于如何确定“标准”库类型是否实现了Serializable
:除了查阅文档之外,如果您想确保可序列化类型,您可以只显式声明类型,即:
val linkedset : LinkedHashSet<Serializable> = ...
如果某些内容不可序列化,您将收到编译时错误(除非您进行了不安全的转换,在这种情况下您基本上是在愚弄编译器或您自己)。
关于kotlin - 如何确定某些 Kotlin 标准库类型是否可序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56041812/