我有一个看起来像这样的函数:
fun MyInput?.toOutput() : Output? {
if (this == null) return null
return Output(this.someValue)
}
在我知道我的MyInput
为非 null 的地方(例如,在将input: MyInput
作为参数的方法中(,我希望能够将input.toOutput
用作Output
而不是Output?
我试过使用
contract {
returnsNotNull() implies (this@toOutput != null)
}
但这有倒退的含义。这告诉我,如果toOutput
返回非空类型,则我的input
是非空的。我想告诉分析器有关基于参数的返回值的信息。在Java中,我可以使用org.jetbrains.annotations.@Contract("null -> null ; !null -> !null")
来完成此操作。
有没有办法在 Kotlin 中做到这一点?
合同。您只需要进行不可为空的重载。喜欢这个:
fun MyInput?.toOutput(): Output? {
if (this == null) return null
return Output(this.someValue)
}
fun MyInput.toOutput(): Output = Output(this.someValue)
但是,这在 JVM 上是行不通的,因为函数签名会冲突。要使其正常工作,您必须为其中一个函数指定一个新名称,并带有@JvmName
注释。例如:
@JvmName("toOutputNonNull")
fun MyInput.toOutput(): Output = Output(this.someValue)
你仍然可以像 Kotlin 中的input.toOutput()
一样调用它,但如果你从 Java 调用它,它会变成类似FileNameKt.toOutputNonNull(input)
的东西。