是否可以在 Kotlin 中定义一个可以返回某些内容或不返回任何内容的函数?我想也许可以使用 Any 作为返回类型,但这仍然需要函数返回一些东西,尽管当返回类型为 Any 时,也许有一种方法可以返回一个 Unit?
我还发现了“Nothing”:
<块引用>没有没有实例。可以用Nothing来表示“一个永远不存在的值”:例如,如果一个函数的返回类型为Nothing,则表示它永远不会返回(总是抛出异常)。
不幸的是,这将引发异常。这太糟糕了。我想知道他们为什么会抛出异常?
答案 0 :(得分:2)
你可以将结果包装在一个密封的类中
sealed class Result<out T> {
data class Success<out T>(val value: T): Result<T>()
object Failure: Result<Nothing>()
}
然后你可以调用它
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
}
}
答案 1 :(得分:1)
您可以只使用可为空的返回类型。
否则,要解决是否可以返回 Unit
,您可以。 Unit
只是一个 Kotlin 对象,因此您可以通过名称获取实例:
return Unit
不过我不推荐它,有很多更好的选择。
关于Nothing
,它是一种特殊类型,用于表示永远不会返回的函数。因此,如果我想编写一个抛出异常的函数,我可以使用 Nothing
返回类型来实现。然后推理引擎知道我的函数调用之后的任何内容都不会被执行。
答案 2 :(得分:0)
好吧,如果你仔细想想,一个函数不能返回或什么,因为调用它的结果是什么?你有没有价值,或者什么都没有?如果你把结果赋值给一个变量,但是没有结果,这个变量就没有值,那是什么?该函数必须定义为始终返回something 或始终返回nothing,因此您始终知道是否有返回值及其可能的类型。否则我们就会进入哲学领域!
事实上在 Kotlin 中,函数总是返回 something - 如果你不指定类型,比如 Java 中的 void
函数,它会默认返回 Unit
.这是一个特殊的值,它表示一个不返回结果的函数,但它仍然是一个返回的结果类型。这不是没什么,而是一件事。每个函数都必须返回一个东西。
因此,如果要将返回的事物定义为“表示事物的值”或“不表示任何事物的值”,则需要一个类型能够表达这两种想法。我认为您有三种基本方法:
Int
,“NO_VALUE”表示 String
,诸如此类Result
类型、Java 中的 Optional
类型等null
因为每种类型的可为空版本都内置在 Kotlin 的类型系统中,并且标准库旨在处理它们。 Check out these features built around working with nulls使用可空类型 IMO - 返回 String?
或其他任何内容,如果结果为非空,则对该值执行某些操作。如果它为空,则忽略它。 Kotlin 让这一切变得非常简单!如果您到了需要滚动特殊类型的地步,您可能会知道为什么需要它而不是您的好朋友null