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

标签 kotlin

在下面的代码中,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/

相关文章:

android - 如何在 Kotlin 中设置一个带有复合可绘制对象的 TextView,它是一个 URL 图像,加载了 Glide?

android - Kotlin 项目中忽略了 BindingAdapter 注解。我怎样才能改变这个代码工作?

java - 将通用 RecyclerView 适配器转换为 Kotlin

kotlin - Kotlin 中的构建器模式

java - Kotlin 中的 Try-catch block ——返回什么

unit-testing - 在 Kotlin 中获取具有不同值的两张 map 的交集

android - Kotlin正则表达式不适用于我在运行时得到的波兰char (“ł”)

kotlin - 是否有可能在kotlin中随机获取枚举类的元素?

spring - 如何将spring kafka容器分配给特定分区并能够停止/启动它?

android - 来自 Android 的 Firebase 复杂查询导致错误