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



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

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)的东西。

相关内容

  • 没有找到相关文章

最新更新