74

来自 Kotlin 文档:

如果一个函数没有返回任何有用的值,它的返回类型是 Unit。Unit 是一种只有一个值的类型——Unit.VALUE。该值不必显式返回:

fun printHello(name : String?) : Unit { 
   if (name != null) 
     print("Hello, $name!") 
   else 
     print("Hi there!") 
   // We don't need to write 'return Unit.VALUE' or 'return', although we could 
}

函数中返回单位的目的是什么?为什么 VALUE 在那里?这个价值是多少?

4

3 回答 3

140

目的与 C 或 Java 相同void。只有 Unit 是正确的类型,所以它可以作为泛型参数等传递。

  1. 为什么我们不叫它“Void”:因为“void”这个词的意思是“没有”,还有另一种类型,Nothing即“根本没有价值”,即计算没有正常完成(永远循环或抛出一个例外)。我们无法承受意义的冲突。

  2. 为什么 Unit 有值(即与 Nothing 不同):因为通用代码可以顺利运行。如果您为通用参数 T 传递 Unit,则为任何 T 编写的代码都需要一个对象,并且必须有一个对象,即 Unit 的唯一值。

  3. 如何访问 Unit 的值:因为它是一个单例对象,所以说Unit

于 2014-03-26T08:37:10.917 回答
19

Unit存在的主要原因是Generic原因。让我们使用 Kotlin 文档中的示例。

class Box<T>(t: T) {
    var value = t
}

我们可以有

var box = Box(Unit)

这就是为什么 Unit 返回一个值,以便 Kotlin 可以从传递给类初始化的类型推断它。当然,你也可以这样显式地写,

var box = Box<Unit>(Unit)

但都一样,它必须有一个返回值。现在,Kotlin 中 Java 中的void关键字是Nothing在 Kotlin 的类型层次结构中, Nothing是最后一种类型,而最后一种是Nothing?(可以为空)。这根本不返回任何值。因为它根本不返回任何值,所以我们不能在上面的代码中将它作为类型传递。

var box = Box(Nothing) //This will return an Error
于 2017-06-09T14:14:05.943 回答
8

UNIT实际上包含有价值的信息,它基本上只是意味着“完成”。它只是将信息返回给调用者,即方法已完成。这是一条真实的信息,因此可以将其视为方法的返回值

于 2018-08-24T20:00:46.573 回答