Kotlin Void, Unit, Nothing:2025年完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin - Void vs. Unit vs. Nothing:2025年最佳实践

\n\n

各位同行,大家好!如果你曾经写过Kotlin代码,并且思考过:“为什么这里用Unit而不是void?Nothing又是什么东西?”——那你来对地方了。这个话题在Stack Overflow上可是热门中的热门,拥有数千次浏览量,这绝非偶然。Void、Unit和Nothing之间的混淆,足以让经验丰富的开发者感到困惑。到了2025年,当Kotlin在后端(Ktor、Spring)和Android领域稳占一席之地时,理解这些类型不再是一种奢求,而是编写干净、安全且富有表现力代码的必要条件。

\n\n

在这篇文章中,我们不会仅仅罗列定义。我们将通过实际示例深入剖析,展示每种类型在何时适用,何时又是绝对禁忌。开始吧!

\n\n

快速概览:它们分别是什么?

\n\n

让我们立刻澄清一下。这三种类型解决的是不同的问题,尽管乍看之下它们似乎很相似。

\n\n
    \n
  • Void — 这是Java的遗留产物。在Kotlin中,它仅用于兼容性目的。永远不要在纯Kotlin代码中使用它。
  • \n
  • Unit — 意思是“我不返回任何东西,但我仍然是一个类型”。它是Java中void的对应物,但更好用。在99%的情况下,当函数不返回有意义的结果时,都会使用它。
  • \n
  • Nothing — 意思是“该函数永远不会正常结束”。它要么抛出异常,要么进入无限循环。这是一个用于控制执行流的强大工具。
  • \n
\n\n

听起来很简单?让我们深入探讨。

\n\n

Void — 群体中的异类

\n\n

如果你在编写纯Kotlin代码,请像忘记噩梦一样忘记Void。它是来自Java的类(java.lang.Void),是关键字void的包装器。它在Kotlin中存在的唯一目的是与Java代码进行互操作。

\n\n

以下是一个Void可能出现在你项目中的例子:

\n\n
import java.lang.Void\n\n// 在纯Kotlin中永远不要这样做!\nfun doSomething(): Void? {\n    println("正在做某事...")\n    return null // 必须返回null,否则编译错误\n}
\n\n

看到这个return null了吗?这是它最大的缺点。Void是无法创建实例的(它的构造函数是私有的),但它可以是null。这会导致混乱和多余的代码。

\n\n

2025年最佳实践:仅当你重写一个需要Void作为泛型参数的Java库方法时,才使用Void。例如,在Callable<Void>中。在所有其他情况下,请使用Unit。

\n\n

Unit — 空函数之王

\n\n

Unit是Kotlin真正用来表达“函数已执行,但我不关心其结果”的方式。与void不同,Unit是一个完整的类型,只有一个值——Unit。

\n\n

这带来了很酷的可能性:

\n\n
    \n
  1. 泛型。你可以在泛型函数中使用Unit。
  2. \n
  3. 高阶函数。你可以将返回Unit的函数作为参数传递。
  4. \n
  5. 扩展函数。可以编写返回Unit的扩展函数。
  6. \n
\n\n

一个标准的例子是Lambda表达式:

\n\n
fun executeAction(action: () -> Unit) {\n    println("准备执行操作...")\n    action() // 调用传入的函数\n    println("操作已完成。")\n}\n\nfun main() {\n    // 一个不返回任何值但产生副作用的Lambda\n    executeAction {\n        println("来自Lambda的问候!")\n    }\n}
\n\n

这里

博客

书籍推荐