我有一个看起来像这样的函数
fun MyInput?.toOutput() : Output? {
if (this == null) return null
return Output(this.someValue)
}
在我知道我的MyInput
非空的地方(例如,在一个以input: MyInput
作为参数的方法中),我希望能够使用{{ 1}}为input.toOutput
,而不是Output
我尝试使用
Output?
但这意味着倒退。这告诉我,如果contract {
returnsNotNull() implies (this@toOutput != null)
}
返回非空类型,则我的toOutput
为非空。我想告诉分析器有关基于参数的返回值的信息。在Java中,我可以使用input
完成此操作。
在Kotlin中有没有办法做到这一点?
答案 0 :(得分:4)
您不需要合同。您只需要进行一个不可为空的重载。像这样:
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)
一样。