Kotlin合约推断返回值而不是参数值

时间:2019-04-25 16:24:08

标签: kotlin kotlin-contracts

我有一个看起来像这样的函数

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中有没有办法做到这一点?

1 个答案:

答案 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)一样。