在以下代码中,linkedSet
变量的类型为LinkedHashSet<Serializable>
:
val linkedSet = linkedSetOf(linkedSetOf(1, 2, 3), 2)
结果集中的第一个元素是LinkedHashSet<Int>
。在LinkedHashSet
的层次结构中,我没有找到Serializable
。 Int
也是如此。
为什么继承Serializable
并不明确?我怎么知道某种Serializable
呢?
答案 0 :(得分:3)
实际上,如果您以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
,并通过Serializable
实现java.lang.Number
。
您可以使用以下方法在运行时检查实际类型:
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> = ...
如果某些东西不可序列化,那么您将收到编译时错误(除非您进行了不安全的强制转换,否则您基本上会愚弄编译器或自己)。
答案 1 :(得分:0)