Kotlin 面试题
目录

Kotlin 中星投影 (Star-Projection) 的用法?

· 约 3 分钟读完 · 第 106 / 200 章

推荐答案

在 Kotlin 中,星投影(Star-Projection)是一种用于表示泛型类型的不确定类型的语法。它使用 * 来表示未知的类型参数。星投影通常用于以下场景:

  1. 当你不关心泛型的具体类型时:你可以使用 * 来表示任何类型。
  2. 当你需要处理泛型类型的集合时:例如,List<*> 表示一个包含任意类型元素的列表。

示例代码

在这个例子中,printList 函数接受一个 List<*> 类型的参数,这意味着它可以接受任何类型的列表,而不需要关心列表中的具体类型。

本题详细解读

什么是星投影?

星投影是 Kotlin 中用于表示泛型类型的不确定类型的语法。它允许你在不知道具体类型参数的情况下使用泛型类型。星投影的主要用途是提供类型安全的同时,允许你处理未知类型的泛型对象。

星投影的语法

星投影的语法非常简单,只需要在泛型类型参数的位置使用 * 即可。例如:

  • List<*> 表示一个包含任意类型元素的列表。
  • Map<*, *> 表示一个键和值类型都未知的映射。

星投影的使用场景

  1. 处理未知类型的集合:当你需要处理一个泛型集合,但不需要知道集合中元素的具体类型时,可以使用星投影。例如,List<*> 可以表示任何类型的列表。

  2. 类型安全的泛型操作:星投影允许你在不指定具体类型的情况下进行类型安全的操作。例如,你可以安全地遍历一个 List<*>,而不需要知道列表中元素的具体类型。

  3. 与 Java 互操作:在与 Java 代码互操作时,星投影可以帮助你处理 Java 中的原始类型(Raw Types)。例如,Java 中的 List 可以对应 Kotlin 中的 List<*>。

星投影的限制

虽然星投影非常有用,但它也有一些限制:

  1. 不能写入:你不能向一个星投影类型的变量写入数据,因为你不知道具体的类型参数。例如,你不能向 List<*> 中添加元素。

  2. 类型信息丢失:使用星投影时,具体的类型信息会丢失。因此,你不能对星投影类型的对象进行类型特定的操作。

示例代码解析

在示例代码中,printList 函数接受一个 List<*> 类型的参数。这意味着它可以接受任何类型的列表,而不需要关心列表中的具体类型。在 main 函数中,我们分别传递了一个 Int 类型的列表和一个 String 类型的列表给 printList 函数,函数能够正确地遍历并打印列表中的元素。

通过使用星投影,我们可以在不知道具体类型的情况下,安全地处理泛型集合。