如何确定某些Kotlin标准库类型是否可序列化?

时间:2019-05-08 13:19:49

标签: kotlin

在以下代码中,linkedSet变量的类型为LinkedHashSet<Serializable>

val linkedSet = linkedSetOf(linkedSetOf(1, 2, 3), 2)

结果集中的第一个元素是LinkedHashSet<Int>。在LinkedHashSet的层次结构中,我没有找到SerializableInt也是如此。

为什么继承Serializable并不明确?我怎么知道某种Serializable呢?

2 个答案:

答案 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)

如果您使用的是IDE,借助Lint,您可以轻松检查任何类型的内容:

enter image description here