请解释 Kotlin 泛型与 Java 泛型的差异,并说明型变的含义及其在 Kotlin 中的体现。
考察说明
考察 Kotlin 与 Java 泛型机制的对比理解,以及 Kotlin 声明处型变的掌握程度。
回答思路
- 【回答框架 1】Kotlin 泛型与 Java 泛型在基础机制上一致,都是编译期类型安全检查,运行时通过类型擦除实现,因此泛型类型参数在运行时不可知。
- 【回答框架 2】主要差异在于型变支持:Java 使用使用处型变(通配符 ? extends 和 ? super),而 Kotlin 同时支持声明处型变(in/out)和使用处型变(类型投影)。
- 【回答框架 3】Kotlin 的 out 关键字表示协变,类似 ? extends T,只能读取生产者;in 关键字表示逆变,类似 ? super T,只能写入消费者。声明处型变使泛型类型参数在声明时即明确其协变或逆变属性,代码更简洁。
- 【回答框架 4】另外 Kotlin 的 star 投影 `*` 等价于 `out Any?`,用于不知道具体类型参数时的情况,Java 中则用无界通配符 ?。
- 【回答框架 5】泛型函数、类型约束和具体化类型参数(reified)也是 Kotlin 相对 Java 的增强,但型变是核心区别。
- 【关键点 1】Kotlin 泛型同样基于类型擦除,运行时不保留类型参数信息。
- 【关键点 2】Java 仅支持使用处型变,用 ? extends 和 ? super;Kotlin 支持声明处型变和类型投影。
- 【关键点 3】Kotlin 中 out 对应协变(生产者),in 对应逆变(消费者),使用更安全且代码更清晰。