如果主题不为空,如何分辨扩展方法返回非空

时间:2019-07-08 12:11:43

标签: kotlin type-inference

我已经实现了以下方法:

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

正在使用它的代码如下:

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

但是,a的推断类型为String?。 对于合同,我可以说,如果返回值不为null,则subject也不为null:

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

可以说相反吗?我的意思是推断a的类型不为null?还有另一种方法吗?

1 个答案:

答案 0 :(得分:4)

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

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

T扩展字符串?表示T类型可以是String或null或两者都可以,并且每个T类型都是,函数也返回该类型