Kotlin: Cannot access java.io.Serializable’ which is a supertype of ‘kotlin.Int’

Kotlin IDE配置问题

环境

IntelliJ IDEA CE

问题描述

新建一个项目,用于学习 Kotlin。但一开始就遇到了拦路虎。
代码如下:

>>> TypeIntro.kt
fun main(args: Array<String>) {
   var expriencePoints: Int = 5
   expriencePoints += 5
   println(expriencePoints)
}

IDE 提示 += 有误,运行提示错误:

Kotlin: Cannot access java.io.Serializable’ which is a supertype of ‘kotlin.Int’

问题分析

从项目配置上没有看出问题,在 优快云 上查找:

  • 文章[1]说是可能 SDK 设置冲突,但我设置中没看出问题;
  • 文章[2]说是手动导入 java.io 包,没找到如何导入,再说 Kotlin 就是一种 JVM 语言,且完全兼容 Java,貌似还要手动导入没道理。但其表示” kotlin里面确实没有这个类。Serializable是java.io包中的一个类“给了我启示,就是一定是哪里设置错误。

问题解决

IDE配置项只有两个地方:(1) Preference -> Build, (2) File -> Project Structure。第二项最有可能。
当前配置为:
初始配置观察这里,Project SDK 为 11,但不知道是什么东西的版本。此时下面的 Project language level对应为 SDK default.

按下图修改 Project SDK 为 1.8 (java version “1.8.0_102”),注意 Project language leve 也自动变化了:
修改后配置重新运行,就正常了。

至于原因,因时间有限,暂时不深究了。有清楚的可以留言,我会更新加上。

参考文献

[1] Android与kotlin报错
[2] kotlin之Serializable

Kotlin 中使用 `java.io.Serializable` 处理数据,主要是为了实现对象的序列化与反序列化,以便将对象保存到文件、通过网络传输或在进程间传递。Kotlin 完全兼容 Java 的序列化机制,因此你可以像在 Java 中一样使用 `java.io.Serializable` 接口。 下面是一个完整的示例,展示如何在 Kotlin 中使用 `java.io.Serializable` 来序列化和反序列化对象。 ### 示例:使用 `Serializable` 序列化和反序列化用户对象 ```kotlin import java.io.* // 1. 实现 Serializable 接口 data class User( val id: Int, val name: String, val email: String ) : Serializable { // 可选:定义 serialVersionUID 以确保版本兼容性 companion object { private const val serialVersionUID: Long = 1L } } fun main() { // 要序列化的对象 val user = User(1, "Alice", "alice@example.com") // 2. 序列化对象到文件 serializeUser(user, "user.ser") // 3. 从文件反序列化对象 val deserializedUser = deserializeUser("user.ser") println(deserializedUser) } // 序列化函数 fun serializeUser(user: User, filename: String) { ObjectOutputStream(FileOutputStream(filename)).use { output -> output.writeObject(user) } println("对象已序列化到 $filename") } // 反序列化函数 fun deserializeUser(filename: String): User { ObjectInputStream(FileInputStream(filename)).use { input -> return input.readObject() as User } } ``` --- ### 代码解释: 1. **`User` 类实现 `Serializable`**: - `data class User` 实现了 `java.io.Serializable` 接口。 - 虽然接口是空的(标记接口),但它告诉 JVM 这个类可以被序列化。 - 建议显式定义 `serialVersionUID`,避免因类结构变化导致反序列化失败。 2. **序列化过程(`serializeUser`)**: - 使用 `ObjectOutputStream` 包装一个文件输出流。 - 调用 `writeObject()` 将对象写入文件。 - 使用 `use` 确保资源自动关闭。 3. **反序列化过程(`deserializeUser`)**: - 使用 `ObjectInputStream` 读取文件中的字节流。 - 调用 `readObject()` 并强制转换为 `User` 类型。 - 同样使用 `use` 确保流正确关闭。 4. **异常处理**: - 实际开发中应捕获 `IOException` 和 `ClassNotFoundException`。 - 上述代码依赖 `use` 自动处理底层异常。 --- ### 注意事项: - **安全性**:Java 序列化存在安全风险,不建议用于不受信任的数据源。 - **性能**:序列化后的数据是二进制格式,体积较大,不适合高性能场景。 - **替代方案**:对于现代应用,推荐使用 JSON(如 Gson、Jackson、Kotlinx Serialization)进行数据持久化或通信。 --- ### 如何处理不想序列化的字段? 使用 `transient` 关键字标记不需要序列化的字段: ```kotlin data class User( val id: Int, val name: String, val email: String ) : Serializable { @Transient var password: String? = null // 不会被序列化 companion object { private const val serialVersionUID: Long = 1L } } ``` 这样 `password` 字段在序列化时会被忽略。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值