如果主题不为空,如何判断扩展方法 returns 为非空

How to tell that an extension method returns non-null if subject is not null

我实现了以下方法:

private fun String?.replaceHolder(item: String): String? {
  return this?.replace("$deployUnit", item)
}

使用它的代码如下所示:

val a = "aaa".replaceHolder("fff")

然而,a的推断类型是String?。 对于合同,我可以说,如果 return 值不为 null,那么 subject was 就不是 null,就像这样:

@ExperimentalContracts
private fun String?.replaceHolder(item: String): String? {
  contract {
    returnsNotNull() implies (this@replaceHolder != null)
  }
  return this?.replace("$deployUnit", item)
}

反话可以吗?我的意思是推断 a 的类型不为空?还有其他方法吗?

如果我很了解你,这就是你想要的

private fun <T: String?> T.replaceHolder(item: String): T {
    return this?.replace("$deployUnit", item) as T
}

T 扩展字符串?意味着 T 类型可以是 String 或 null 或两者都是,并且每个类型 T 都是函数 return 该类型也是