Kotlin 可以返回某物或不返回任何内容的函数

Kotlin 可以返回某物或不返回任何内容的函数,kotlin,Kotlin,是否可以在Kotlin中定义一个函数,您可以在其中返回某些内容或不返回任何内容?我认为可以使用Any作为返回类型,但这仍然需要函数返回一些东西,尽管当返回类型为Any时,可能有一种方法可以返回一个单元 我还发现“什么都没有”: 凡事皆有实例。您可以使用Nothing来表示“从不存在的值”:例如,如果函数的返回类型为Nothing,则表示它从不返回(总是抛出异常) 不幸的是,这将抛出一个异常。那太糟糕了。我想知道他们为什么会抛出异常?您可以使用可为空的返回类型 否则,要确定是否可以返回单元,可以单

是否可以在Kotlin中定义一个函数,您可以在其中返回某些内容或不返回任何内容?我认为可以使用Any作为返回类型,但这仍然需要函数返回一些东西,尽管当返回类型为Any时,可能有一种方法可以返回一个单元

我还发现“什么都没有”:

凡事皆有实例。您可以使用Nothing来表示“从不存在的值”:例如,如果函数的返回类型为Nothing,则表示它从不返回(总是抛出异常)


不幸的是,这将抛出一个异常。那太糟糕了。我想知道他们为什么会抛出异常?

您可以使用可为空的返回类型

否则,要确定是否可以返回
单元
,可以<代码>单元只是一个Kotlin对象,因此您可以按名称获取实例:

return Unit
但是我不推荐,有很多更好的选择


对于
Nothing
,它是一种特殊类型,用于表示永不返回的函数。所以,如果我想编写一个抛出异常的函数,我可以使用
Nothing
返回类型。然后,推理引擎知道不会执行任何超过我的函数调用的操作。

您可以将结果封装在一个密封的类中

sealed class Result<out T> {
    data class Success<out T>(val value: T): Result<T>()
    object Failure: Result<Nothing>()
}

如果你仔细想想,函数不能返回什么都不返回,因为调用它的结果是什么?你有价值吗,还是什么都没有?如果将结果赋给变量,但没有结果,则该变量没有值,那么它是什么?该函数必须定义为始终返回某物或始终返回,以便您始终知道是否存在返回值及其可能的类型。否则我们将进入哲学领域

事实上,在Kotlin中,函数总是返回某物——如果不指定类型,比如Java中的
void
函数,它将默认返回
单元
。这是一个特殊值,表示不返回结果的函数,但它仍然是返回的结果类型。这不是什么,这是一件事。每个函数都必须返回一个对象

因此,如果要将返回的对象定义为“表示对象的值”或“不表示任何内容的值”,则需要能够同时表示这两种想法的类型。我认为有三种基本方法:

  • 使用特定值表示“无值”,例如-1表示
    Int
    ,“无值”表示
    字符串
    ,诸如此类
  • 创建一个定义其自身“无值”版本的类型,如其中一个答案中的
    结果
    类型、Java中的
    可选
    类型等
  • 只需使用
    null
    ,因为Kotlin的类型系统中内置了每种类型的可为null的版本,并且标准库专门用于处理它们

使用可为null的类型IMO-返回
字符串?
或其他任何内容,如果结果为非null,则对该值执行一些操作。如果为空,则忽略它。科特林让这变得很容易!如果您需要滚动一个特殊类型,您可能会知道为什么您需要它而不是您的好友
null

您可以返回一个可空类型,并让
null
表示“无值”。或者,您可以返回不可为null的类型,并让函数在没有可返回的值时引发异常。如果有人知道用例是什么,他们可能会为您提供合适的解决方案。阅读这个问题时,我通常会推荐密封类,但我不知道这是否适合您的用例。
Nothing
不会引发异常。它是一种返回类型,意味着函数没有返回值,只有在函数引发异常时才可能返回。没有
Nothing
的实例,因此它实际上无法返回。当涉及到类型推断时,没有任何事物被视为万物的子类型。Kotlin需要像
Nothing
这样的类型,因此像if/else或when这样的分支表达式可以有引发异常的分支,而不会影响表达式的结果类型。它还可以用于泛型变量。构造函数参数不能为空,也不能为其指定默认值,因为它不能包含任何值。如果
value
仅在
Success
类中定义,则密封类示例更有意义。
success
类本身不能是数据类,因为它有一个非属性构造函数参数。@Tenfour04 partial yes,它应该足以让OP看到它是否工作。如果他们是Kotlin的新手,他们可能会因为它有多个错误而难以使其可编译。@Tenfour04这是一个很好的观察,介意将其转换为编辑吗?@Tenfour04谢谢,我喜欢使用
out
,非常即时,我会完全错过它。
fun <Type>calculateResult(...): Result<Type> {
   //calculate and return some implementation
}
val result = calculateResult(inputs)
when (result) {
   is Success -> {
       val value = success.value
   }
   is Failure -> {
       //Do something like show an error the user you know your value is Nothing
   }

}